startInteraction(event, windowState.id, 'resize-e', windowState)}
+ />
+
startInteraction(event, windowState.id, 'resize-s', windowState)}
+ />
+
startInteraction(event, windowState.id, 'resize-se', windowState)}
+ />
+
+ );
+ })}
+
+ );
+};
+
+export default FloatingQueryResultWindows;
diff --git a/frontend/src/components/FloatingWorkbenchWindows.tsx b/frontend/src/components/FloatingWorkbenchWindows.tsx
new file mode 100644
index 00000000..d334ed6a
--- /dev/null
+++ b/frontend/src/components/FloatingWorkbenchWindows.tsx
@@ -0,0 +1,357 @@
+import React, { useCallback, useMemo, useRef } from 'react';
+import { Button, Tooltip } from 'antd';
+import { CloseOutlined, CompressOutlined } from '@ant-design/icons';
+import { useStore } from '../store';
+import { t } from '../i18n';
+import {
+ buildTabDisplayModel,
+ resolveConnectionHostSummary,
+} from '../utils/tabDisplay';
+import {
+ clamp,
+ DEFAULT_DETACHED_WINDOW_MIN_HEIGHT,
+ DEFAULT_DETACHED_WINDOW_MIN_WIDTH,
+ DETACHED_WINDOW_VIEWPORT_PADDING,
+ resolveDetachedWindowTitle,
+} from '../utils/detachedWindow';
+import WorkbenchTabContent from './WorkbenchTabContent';
+
+const getTabKindLabel = (type: string): string => {
+ if (type === 'query') return t('tab_manager.kind_badge.query');
+ if (type === 'table') return t('tab_manager.kind_badge.table');
+ if (type === 'design') return t('tab_manager.kind_badge.design');
+ if (type === 'table-overview') return t('tab_manager.kind_badge.table_overview');
+ if (type === 'table-export') return t('tab_manager.kind_badge.table_export');
+ if (type === 'sql-file-execution') return t('sidebar.sql_file_exec.title');
+ if (type === 'sql-analysis') return t('tab_manager.kind_badge.sql_analysis');
+ if (type.startsWith('redis')) return t('tab_manager.kind_badge.redis');
+ if (type.startsWith('jvm')) return t('tab_manager.kind_badge.jvm');
+ if (type === 'trigger') return t('tab_manager.kind_badge.trigger');
+ if (type === 'view-def') return t('tab_manager.kind_badge.view');
+ if (type === 'event-def') return t('tab_manager.kind_badge.event');
+ if (type === 'routine-def') return t('tab_manager.kind_badge.routine');
+ if (type === 'sequence-def') return t('tab_manager.kind_badge.sequence');
+ if (type === 'package-def') return t('tab_manager.kind_badge.package');
+ return t('tab_manager.kind_badge.fallback');
+};
+
+type DragMode = 'move' | 'resize-e' | 'resize-s' | 'resize-se';
+
+const FloatingWorkbenchWindows: React.FC = () => {
+ const tabs = useStore((state) => state.tabs);
+ const connections = useStore((state) => state.connections);
+ const appearance = useStore((state) => state.appearance);
+ const theme = useStore((state) => state.theme);
+ const detachedWorkbenchWindows = useStore((state) => state.detachedWorkbenchWindows);
+ const activeTabId = useStore((state) => state.activeTabId);
+ const attachWorkbenchTab = useStore((state) => state.attachWorkbenchTab);
+ const closeTab = useStore((state) => state.closeTab);
+ const updateDetachedWorkbenchBounds = useStore((state) => state.updateDetachedWorkbenchBounds);
+ const focusDetachedWorkbenchTab = useStore((state) => state.focusDetachedWorkbenchTab);
+ const dragRef = useRef<{
+ tabId: string;
+ mode: DragMode;
+ startX: number;
+ startY: number;
+ originX: number;
+ originY: number;
+ originW: number;
+ originH: number;
+ } | null>(null);
+
+ const windowModels = useMemo(() => {
+ return detachedWorkbenchWindows
+ .map((windowState) => {
+ const tab = tabs.find((item) => item.id === windowState.tabId);
+ if (!tab) return null;
+ const connection = connections.find((conn) => conn.id === tab.connectionId);
+ const displayModel = buildTabDisplayModel(tab, connection, appearance.tabDisplay, t);
+ const kindLabel = getTabKindLabel(tab.type);
+ const objectLabel =
+ tab.tableName ||
+ tab.viewName ||
+ tab.eventName ||
+ tab.routineName ||
+ tab.sequenceName ||
+ tab.packageName ||
+ tab.triggerName ||
+ tab.resourcePath ||
+ tab.filePath ||
+ '';
+ const title = resolveDetachedWindowTitle({
+ kindLabel,
+ objectLabel,
+ fallbackTitle: displayModel.fullTitle || tab.title || t('tab_manager.detached.title_fallback'),
+ });
+ return {
+ windowState,
+ tab,
+ title,
+ hostSummary: resolveConnectionHostSummary(connection?.config),
+ connectionName: connection?.name || '',
+ isFocused: activeTabId === tab.id,
+ };
+ })
+ .filter(Boolean) as Array<{
+ windowState: (typeof detachedWorkbenchWindows)[number];
+ tab: (typeof tabs)[number];
+ title: string;
+ hostSummary: string;
+ connectionName: string;
+ isFocused: boolean;
+ }>;
+ }, [activeTabId, appearance.tabDisplay, connections, detachedWorkbenchWindows, tabs]);
+
+ const startInteraction = useCallback((
+ event: React.PointerEvent,
+ tabId: string,
+ mode: DragMode,
+ bounds: { x: number; y: number; width: number; height: number },
+ ) => {
+ if (event.button !== 0) return;
+ event.preventDefault();
+ event.stopPropagation();
+ focusDetachedWorkbenchTab(tabId);
+ dragRef.current = {
+ tabId,
+ mode,
+ startX: event.clientX,
+ startY: event.clientY,
+ originX: bounds.x,
+ originY: bounds.y,
+ originW: bounds.width,
+ originH: bounds.height,
+ };
+
+ const handleMove = (moveEvent: PointerEvent) => {
+ const drag = dragRef.current;
+ if (!drag) return;
+ const dx = moveEvent.clientX - drag.startX;
+ const dy = moveEvent.clientY - drag.startY;
+ if (drag.mode === 'move') {
+ const maxX = Math.max(
+ DETACHED_WINDOW_VIEWPORT_PADDING,
+ window.innerWidth - drag.originW - DETACHED_WINDOW_VIEWPORT_PADDING,
+ );
+ const maxY = Math.max(
+ DETACHED_WINDOW_VIEWPORT_PADDING,
+ window.innerHeight - drag.originH - DETACHED_WINDOW_VIEWPORT_PADDING,
+ );
+ updateDetachedWorkbenchBounds(drag.tabId, {
+ x: clamp(drag.originX + dx, DETACHED_WINDOW_VIEWPORT_PADDING, maxX),
+ y: clamp(drag.originY + dy, DETACHED_WINDOW_VIEWPORT_PADDING, maxY),
+ });
+ return;
+ }
+ let nextW = drag.originW;
+ let nextH = drag.originH;
+ if (drag.mode === 'resize-e' || drag.mode === 'resize-se') {
+ nextW = clamp(
+ drag.originW + dx,
+ DEFAULT_DETACHED_WINDOW_MIN_WIDTH,
+ window.innerWidth - drag.originX - DETACHED_WINDOW_VIEWPORT_PADDING,
+ );
+ }
+ if (drag.mode === 'resize-s' || drag.mode === 'resize-se') {
+ nextH = clamp(
+ drag.originH + dy,
+ DEFAULT_DETACHED_WINDOW_MIN_HEIGHT,
+ window.innerHeight - drag.originY - DETACHED_WINDOW_VIEWPORT_PADDING,
+ );
+ }
+ updateDetachedWorkbenchBounds(drag.tabId, { width: nextW, height: nextH });
+ };
+
+ const stop = () => {
+ dragRef.current = null;
+ window.removeEventListener('pointermove', handleMove);
+ window.removeEventListener('pointerup', stop);
+ window.removeEventListener('pointercancel', stop);
+ };
+
+ window.addEventListener('pointermove', handleMove);
+ window.addEventListener('pointerup', stop);
+ window.addEventListener('pointercancel', stop);
+ }, [focusDetachedWorkbenchTab, updateDetachedWorkbenchBounds]);
+
+ if (windowModels.length === 0) {
+ return null;
+ }
+
+ const isDark = theme === 'dark';
+
+ return (
+
+
+ {windowModels.map(({ windowState, tab, title, hostSummary, connectionName, isFocused }) => (
+
focusDetachedWorkbenchTab(windowState.tabId)}
+ >
+
startInteraction(event, windowState.tabId, 'move', windowState)}
+ >
+
+ {title}
+ {(connectionName || hostSummary) ? (
+
+ {[connectionName, hostSummary].filter(Boolean).join(' · ')}
+
+ ) : null}
+
+
event.stopPropagation()}>
+
+ }
+ aria-label={t('tab_manager.detached.restore')}
+ onClick={() => attachWorkbenchTab(windowState.tabId)}
+ />
+
+
+ }
+ aria-label={t('tab_manager.detached.close')}
+ onClick={() => closeTab(windowState.tabId)}
+ />
+
+
+
+
+
+
+
startInteraction(event, windowState.tabId, 'resize-e', windowState)}
+ />
+
startInteraction(event, windowState.tabId, 'resize-s', windowState)}
+ />
+
startInteraction(event, windowState.tabId, 'resize-se', windowState)}
+ />
+
+ ))}
+
+ );
+};
+
+export default FloatingWorkbenchWindows;
diff --git a/frontend/src/components/QueryEditor.tsx b/frontend/src/components/QueryEditor.tsx
index be416242..1e58b6d6 100644
--- a/frontend/src/components/QueryEditor.tsx
+++ b/frontend/src/components/QueryEditor.tsx
@@ -54,6 +54,11 @@ import {
hasQueryTabDraft,
persistQueryTabDraftSnapshot,
} from '../utils/sqlFileTabDrafts';
+import {
+ clearQueryEditorResultSession,
+ saveQueryEditorResultSession,
+ takeQueryEditorResultSession,
+} from '../utils/queryEditorResultSessionCache';
import { buildEditableTriggerSql } from '../utils/triggerEditSql';
import {
getColumnDefinitionComment,
@@ -1102,9 +1107,18 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
type ResultSet = QueryEditorResultSet;
- // Result Sets
- const [resultSets, setResultSets] = useState
([]);
- const [activeResultKey, setActiveResultKey] = useState('');
+ // Result Sets (session cache survives detach/attach remounts)
+ const restoredResultSessionRef = useRef(takeQueryEditorResultSession(tab.id));
+ const [resultSets, setResultSets] = useState(
+ () => restoredResultSessionRef.current?.resultSets || [],
+ );
+ const [activeResultKey, setActiveResultKey] = useState(
+ () => restoredResultSessionRef.current?.activeResultKey || '',
+ );
+ const resultSetsRef = useRef(resultSets);
+ const activeResultKeyRef = useRef(activeResultKey);
+ resultSetsRef.current = resultSets;
+ activeResultKeyRef.current = activeResultKey;
const [loading, setLoading] = useState(false);
const [executionError, setExecutionError] = useState('');
const [, setCurrentQueryId] = useState('');
@@ -1246,8 +1260,22 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
const sqlEditorTransactionOptions = useStore(state => state.sqlEditorTransactionOptions);
const setSqlEditorTransactionOptions = useStore(state => state.setSqlEditorTransactionOptions);
const [isResultPanelVisible, setIsResultPanelVisible] = useState(
- () => tab.resultPanelVisible === true
+ () => restoredResultSessionRef.current?.isResultPanelVisible
+ ?? (tab.resultPanelVisible === true)
);
+ const isResultPanelVisibleRef = useRef(isResultPanelVisible);
+ isResultPanelVisibleRef.current = isResultPanelVisible;
+
+ useEffect(() => {
+ // Keep result panel state across detach/attach remounts of the same tab.
+ return () => {
+ saveQueryEditorResultSession(tab.id, {
+ resultSets: resultSetsRef.current,
+ activeResultKey: activeResultKeyRef.current,
+ isResultPanelVisible: isResultPanelVisibleRef.current,
+ });
+ };
+ }, [tab.id]);
const shortcutOptions = useStore(state => state.shortcutOptions);
const activeShortcutPlatform = getShortcutPlatform(isMacLikePlatform());
const runQueryShortcutBinding = useMemo(
@@ -1499,6 +1527,11 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
});
}, [triggerSqlAiCompletionShortcutBinding]);
useEffect(() => {
+ // Prefer remount session cache (detach/attach); otherwise follow tab draft flag.
+ if (restoredResultSessionRef.current && restoredResultSessionRef.current.isResultPanelVisible !== undefined) {
+ setIsResultPanelVisible(restoredResultSessionRef.current.isResultPanelVisible === true);
+ return;
+ }
setIsResultPanelVisible(tab.resultPanelVisible === true);
}, [tab.id, tab.resultPanelVisible]);
const updateResultPanelVisibility = useCallback((visible: boolean) => {
@@ -7659,6 +7692,84 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
setActiveResultKey('');
};
+ const openResultInWindow = (key: string) => {
+ const target = resultSets.find((result) => result.key === key);
+ if (!target) return;
+ const index = resultSets.findIndex((result) => result.key === key);
+ const title = target.resultType === 'message'
+ ? translate('query_editor.results_panel.tab.message', { index: index + 1 })
+ : translate('query_editor.results_panel.detached.title', { index: index + 1 });
+ const windowId = `query-result:${tab.id}:${target.key}`;
+ useStore.getState().detachQueryResultWindow({
+ id: windowId,
+ sourceQueryTabId: tab.id,
+ connectionId: currentConnectionId || tab.connectionId || '',
+ dbName: currentDb || tab.dbName || '',
+ title,
+ result: {
+ key: target.key,
+ sql: target.sql,
+ exportSql: target.exportSql,
+ sourceStatementIndex: target.sourceStatementIndex,
+ statementResultIndex: target.statementResultIndex,
+ rows: target.rows,
+ columns: target.columns,
+ messages: target.messages,
+ resultType: target.resultType,
+ tableName: target.tableName,
+ pkColumns: target.pkColumns || [],
+ editLocator: target.editLocator as any,
+ readOnly: target.readOnly !== false,
+ showRowNumberColumn: target.showRowNumberColumn,
+ truncated: target.truncated,
+ },
+ });
+ handleCloseResult(key);
+ };
+
+ React.useEffect(() => {
+ const handleRestoreQueryResult = (event: Event) => {
+ const detail = (event as CustomEvent).detail || {};
+ const sourceQueryTabId = String(detail.sourceQueryTabId || '').trim();
+ if (sourceQueryTabId !== tab.id) return;
+ const restored = detail.result;
+ if (!restored || typeof restored !== 'object') return;
+ const restoredKey = String(restored.key || '').trim();
+ if (!restoredKey) return;
+ setResultSets((prev) => {
+ if (prev.some((item) => item.key === restoredKey)) {
+ return prev;
+ }
+ return [
+ ...prev,
+ {
+ key: restoredKey,
+ sql: String(restored.sql || ''),
+ exportSql: restored.exportSql,
+ sourceStatementIndex: restored.sourceStatementIndex,
+ statementResultIndex: restored.statementResultIndex,
+ rows: Array.isArray(restored.rows) ? restored.rows : [],
+ columns: Array.isArray(restored.columns) ? restored.columns : [],
+ messages: Array.isArray(restored.messages) ? restored.messages : undefined,
+ resultType: restored.resultType === 'message' ? 'message' : 'grid',
+ tableName: restored.tableName,
+ pkColumns: Array.isArray(restored.pkColumns) ? restored.pkColumns : [],
+ editLocator: restored.editLocator,
+ readOnly: restored.readOnly !== false,
+ showRowNumberColumn: restored.showRowNumberColumn,
+ truncated: restored.truncated,
+ } as ResultSet,
+ ];
+ });
+ setActiveResultKey(restoredKey);
+ updateResultPanelVisibility(true);
+ };
+ window.addEventListener('gonavi:restore-query-result', handleRestoreQueryResult as EventListener);
+ return () => {
+ window.removeEventListener('gonavi:restore-query-result', handleRestoreQueryResult as EventListener);
+ };
+ }, [tab.id, updateResultPanelVisibility]);
+
const toggleQueryResultsPanelShortcutLabel =
toggleQueryResultsPanelShortcutBinding.enabled && toggleQueryResultsPanelShortcutBinding.combo
? getShortcutDisplayLabel(toggleQueryResultsPanelShortcutBinding.combo, activeShortcutPlatform)
@@ -7813,6 +7924,7 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
onCloseResultTabsToLeft={closeResultTabsToLeft}
onCloseResultTabsToRight={closeResultTabsToRight}
onCloseAllResultTabs={closeAllResultTabs}
+ onOpenResultInWindow={openResultInWindow}
onReloadResult={handleReloadResult}
onResultPageChange={handleResultPageChange}
onDiagnoseExecutionError={handleDiagnoseExecutionError}
diff --git a/frontend/src/components/QueryEditorResultsPanel.tsx b/frontend/src/components/QueryEditorResultsPanel.tsx
index f488de70..eefe3dba 100644
--- a/frontend/src/components/QueryEditorResultsPanel.tsx
+++ b/frontend/src/components/QueryEditorResultsPanel.tsx
@@ -50,6 +50,7 @@ interface QueryEditorResultsPanelProps {
onCloseResultTabsToLeft: (key: string) => void;
onCloseResultTabsToRight: (key: string) => void;
onCloseAllResultTabs: () => void;
+ onOpenResultInWindow?: (key: string) => void;
onReloadResult: (key: string, sql: string) => void;
onResultPageChange: (key: string, page: number, pageSize: number) => void;
onDiagnoseExecutionError: () => void;
@@ -81,6 +82,7 @@ const QueryEditorResultsPanel: React.FC = ({
onCloseResultTabsToLeft,
onCloseResultTabsToRight,
onCloseAllResultTabs,
+ onOpenResultInWindow,
onReloadResult,
onResultPageChange,
onDiagnoseExecutionError,
@@ -196,6 +198,13 @@ const QueryEditorResultsPanel: React.FC = ({
function buildResultTabMenuItems(key: string, index: number): MenuProps['items'] {
return [
+ ...(onOpenResultInWindow
+ ? [{
+ key: 'open-in-window',
+ label: t('query_editor.results_panel.menu.open_in_window'),
+ onClick: () => onOpenResultInWindow(key),
+ }, { type: 'divider' as const }]
+ : []),
{ key: 'close-other', label: t('query_editor.results_panel.menu.close_other'), disabled: resultSets.length <= 1, onClick: () => onCloseOtherResultTabs(key) },
{ key: 'close-left', label: t('query_editor.results_panel.menu.close_left'), disabled: index <= 0, onClick: () => onCloseResultTabsToLeft(key) },
{ key: 'close-right', label: t('query_editor.results_panel.menu.close_right'), disabled: index >= resultSets.length - 1, onClick: () => onCloseResultTabsToRight(key) },
diff --git a/frontend/src/components/TabManager.tsx b/frontend/src/components/TabManager.tsx
index e72361ba..87704d60 100644
--- a/frontend/src/components/TabManager.tsx
+++ b/frontend/src/components/TabManager.tsx
@@ -7,25 +7,7 @@ import { DndContext, PointerSensor, closestCenter, useSensor, useSensors } from
import type { DragStartEvent, DragEndEvent } from '@dnd-kit/core';
import { SortableContext, useSortable, horizontalListSortingStrategy } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
-import { restrictToHorizontalAxis } from '@dnd-kit/modifiers';
import { useStore } from '../store';
-import DataViewer from './DataViewer';
-import QueryEditor from './QueryEditor';
-import TableDesigner from './TableDesigner';
-import RedisViewer from './RedisViewer';
-import RedisCommandEditor from './RedisCommandEditor';
-import RedisMonitor from './RedisMonitor';
-import TriggerViewer from './TriggerViewer';
-import DefinitionViewer from './DefinitionViewer';
-import TableOverview from './TableOverview';
-import TableExportWorkbench from './TableExportWorkbench';
-import SQLFileExecutionWorkbench from './SQLFileExecutionWorkbench';
-import JVMOverview from './JVMOverview';
-import JVMResourceBrowser from './JVMResourceBrowser';
-import JVMAuditViewer from './JVMAuditViewer';
-import JVMDiagnosticConsole from './JVMDiagnosticConsole';
-import JVMMonitoringDashboard from './JVMMonitoringDashboard';
-import SqlAnalysisWorkbench from './explain/SqlAnalysisWorkbench';
import type { TabData } from '../types';
import { t } from '../i18n';
import {
@@ -44,6 +26,8 @@ import {
normalizeSQLFileReadContent,
} from '../utils/sqlFileTabDirty';
import { clearSQLFileTabDraft, getSQLFileTabDraft } from '../utils/sqlFileTabDrafts';
+import WorkbenchTabContent from './WorkbenchTabContent';
+import { shouldDetachTabByDrag } from '../utils/detachedWindow';
const getTabKindLabel = (tab: TabData): string => {
if (tab.type === 'query') return t('tab_manager.kind_badge.query');
@@ -396,63 +380,9 @@ const DraggableTabNode: React.FC = ({ node }) => {
});
};
-const TabContent: React.FC<{ tab: TabData; isActive: boolean }> = React.memo(({ tab, isActive }) => {
- if (tab.type === 'query') {
- return ;
- }
- if (tab.type === 'table') {
- return ;
- }
- if (tab.type === 'design') {
- return ;
- }
- if (tab.type === 'redis-keys') {
- return ;
- }
- if (tab.type === 'redis-command') {
- return ;
- }
- if (tab.type === 'redis-monitor') {
- return ;
- }
- if (tab.type === 'trigger') {
- return ;
- }
- if (tab.type === 'view-def' || tab.type === 'event-def' || tab.type === 'routine-def' || tab.type === 'sequence-def' || tab.type === 'package-def') {
- return ;
- }
- if (tab.type === 'table-overview') {
- return ;
- }
- if (tab.type === 'table-export') {
- return ;
- }
- if (tab.type === 'sql-file-execution') {
- return ;
- }
- if (tab.type === 'sql-analysis') {
- return ;
- }
- if (tab.type === 'jvm-overview') {
- return ;
- }
- if (tab.type === 'jvm-resource') {
- return ;
- }
- if (tab.type === 'jvm-audit') {
- return ;
- }
- if (tab.type === 'jvm-diagnostic') {
- return ;
- }
- if (tab.type === 'jvm-monitoring') {
- return ;
- }
- return null;
-});
-
const TabManager: React.FC = React.memo(() => {
const tabs = useStore(state => state.tabs);
+ const detachedWorkbenchWindows = useStore(state => state.detachedWorkbenchWindows);
const connections = useStore(state => state.connections);
const theme = useStore(state => state.theme);
const appearance = useStore(state => state.appearance);
@@ -466,7 +396,16 @@ const TabManager: React.FC = React.memo(() => {
const closeTabsToRight = useStore(state => state.closeTabsToRight);
const closeAllTabs = useStore(state => state.closeAllTabs);
const moveTab = useStore(state => state.moveTab);
+ const detachWorkbenchTab = useStore(state => state.detachWorkbenchTab);
const setAIPanelVisible = useStore(state => state.setAIPanelVisible);
+ const detachedTabIdSet = useMemo(
+ () => new Set(detachedWorkbenchWindows.map((windowState) => windowState.tabId)),
+ [detachedWorkbenchWindows],
+ );
+ const dockedTabs = useMemo(
+ () => tabs.filter((tab) => !detachedTabIdSet.has(tab.id)),
+ [detachedTabIdSet, tabs],
+ );
const tabsNavBorderColor = theme === 'dark' ? 'rgba(255, 255, 255, 0.09)' : 'rgba(0, 0, 0, 0.08)';
const [draggingTabId, setDraggingTabId] = useState(null);
const suppressClickUntilRef = useRef(0);
@@ -477,6 +416,13 @@ const TabManager: React.FC = React.memo(() => {
);
const isV2Ui = appearance.uiVersion === 'v2';
const hasTabs = tabs.length > 0;
+ const hasDockedTabs = dockedTabs.length > 0;
+ const dockedActiveTabId = useMemo(() => {
+ if (activeTabId && dockedTabs.some((tab) => tab.id === activeTabId)) {
+ return activeTabId;
+ }
+ return dockedTabs[0]?.id || null;
+ }, [activeTabId, dockedTabs]);
const pendingCloseTabIdsRef = useRef>(new Set());
const onChange = (newActiveKey: string) => {
@@ -637,8 +583,24 @@ const TabManager: React.FC = React.memo(() => {
const handleDragEnd = (event: DragEndEvent) => {
const sourceId = String(event.active.id || '').trim();
const targetId = String(event.over?.id || '').trim();
+ const deltaY = Number(event.delta?.y || 0);
setDraggingTabId(null);
- if (!sourceId || !targetId || sourceId === targetId) {
+ if (!sourceId) {
+ return;
+ }
+ if (shouldDetachTabByDrag(deltaY, targetId || null)) {
+ suppressClickUntilRef.current = Date.now() + 120;
+ const pointerEvent = event.activatorEvent as PointerEvent | MouseEvent | undefined;
+ const preferredX = typeof pointerEvent?.clientX === 'number'
+ ? Math.max(16, pointerEvent.clientX - 120)
+ : undefined;
+ const preferredY = typeof pointerEvent?.clientY === 'number'
+ ? Math.max(16, pointerEvent.clientY - 20)
+ : undefined;
+ detachWorkbenchTab(sourceId, { x: preferredX, y: preferredY });
+ return;
+ }
+ if (!targetId || sourceId === targetId) {
return;
}
suppressClickUntilRef.current = Date.now() + 120;
@@ -702,14 +664,14 @@ const TabManager: React.FC = React.memo(() => {
return () => window.removeEventListener('gonavi:insert-sql', handleGlobalInsertSql);
}, [tabs, activeTabId, addTab, setActiveTab, connections]);
- const tabIds = useMemo(() => tabs.map((tab) => tab.id), [tabs]);
+ const tabIds = useMemo(() => dockedTabs.map((tab) => tab.id), [dockedTabs]);
const hasDoubleLineTabLabel = useMemo(() => (
- tabs.some((tab) => {
+ dockedTabs.some((tab) => {
const connection = connections.find((conn) => conn.id === tab.connectionId);
const displayModel = buildTabDisplayModel(tab, connection, appearance.tabDisplay, t);
return displayModel.layout === 'double' && Boolean(displayModel.secondaryText);
})
- ), [appearance.tabDisplay, connections, tabs]);
+ ), [appearance.tabDisplay, connections, dockedTabs]);
const renderTabBar: TabsProps['renderTabBar'] = (tabBarProps, DefaultTabBar) => (
@@ -717,12 +679,12 @@ const TabManager: React.FC = React.memo(() => {
);
- const items = useMemo(() => tabs.map((tab, index) => {
+ const items = useMemo(() => dockedTabs.map((tab, index) => {
const connection = connections.find((conn) => conn.id === tab.connectionId);
const displayModel = buildTabDisplayModel(tab, connection, appearance.tabDisplay, t);
const displayTitle = displayModel.fullTitle;
const hostSummary = resolveConnectionHostSummary(connection?.config);
- const tabIsActive = tab.id === activeTabId;
+ const tabIsActive = tab.id === dockedActiveTabId;
const menuItems: MenuProps['items'] = [
{
@@ -731,6 +693,11 @@ const TabManager: React.FC = React.memo(() => {
label: t('tab_manager.menu.tab_display_settings'),
onClick: openTabDisplaySettings,
},
+ {
+ key: 'open-in-window',
+ label: t('tab_manager.menu.open_in_window'),
+ onClick: () => detachWorkbenchTab(tab.id),
+ },
{ type: 'divider' },
{
key: 'close-other',
@@ -742,13 +709,13 @@ const TabManager: React.FC = React.memo(() => {
key: 'close-left',
label: t('tab_manager.menu.close_left'),
disabled: index === 0,
- onClick: () => closeTabsWithSQLFilePrompt(getCloseTabsToLeftIds(tabs, tab.id), () => closeTabsToLeft(tab.id)),
+ onClick: () => closeTabsWithSQLFilePrompt(getCloseTabsToLeftIds(dockedTabs, tab.id), () => closeTabsToLeft(tab.id)),
},
{
key: 'close-right',
label: t('tab_manager.menu.close_right'),
- disabled: index === tabs.length - 1,
- onClick: () => closeTabsWithSQLFilePrompt(getCloseTabsToRightIds(tabs, tab.id), () => closeTabsToRight(tab.id)),
+ disabled: index === dockedTabs.length - 1,
+ onClick: () => closeTabsWithSQLFilePrompt(getCloseTabsToRightIds(dockedTabs, tab.id), () => closeTabsToRight(tab.id)),
},
{ type: 'divider' },
{
@@ -774,9 +741,9 @@ const TabManager: React.FC = React.memo(() => {
),
key: tab.id,
closable: !isV2Ui,
- children: ,
+ children: ,
};
- }), [tabs, connections, appearance.tabDisplay, activeTabId, closeOtherTabs, closeTabsToLeft, closeTabsToRight, closeAllTabs, closeTab, closeTabsWithSQLFilePrompt, isV2Ui, languagePreference]);
+ }), [dockedTabs, dockedActiveTabId, tabs, connections, appearance.tabDisplay, closeOtherTabs, closeTabsToLeft, closeTabsToRight, closeAllTabs, closeTab, closeTabsWithSQLFilePrompt, detachWorkbenchTab, isV2Ui, languagePreference]);
const handleOpenConnectionModal = () => {
const target = document.querySelector('[data-gonavi-create-connection-action="true"]');
@@ -1015,11 +982,13 @@ body[data-theme='dark'] .main-tabs .ant-tabs-tab.ant-tabs-tab-active {
`}
{isV2Ui && !hasTabs ? (
EmptyWorkbench
+ ) : !hasDockedTabs ? (
+ // All tabs are floating: keep empty docked area; floating host still shows content.
+
) : (
= React.memo(({ tab, isActive }) => {
+ if (tab.type === 'query') {
+ return ;
+ }
+ if (tab.type === 'table') {
+ return ;
+ }
+ if (tab.type === 'design') {
+ return ;
+ }
+ if (tab.type === 'redis-keys') {
+ return ;
+ }
+ if (tab.type === 'redis-command') {
+ return ;
+ }
+ if (tab.type === 'redis-monitor') {
+ return ;
+ }
+ if (tab.type === 'trigger') {
+ return ;
+ }
+ if (tab.type === 'view-def' || tab.type === 'event-def' || tab.type === 'routine-def' || tab.type === 'sequence-def' || tab.type === 'package-def') {
+ return ;
+ }
+ if (tab.type === 'table-overview') {
+ return ;
+ }
+ if (tab.type === 'table-export') {
+ return ;
+ }
+ if (tab.type === 'sql-file-execution') {
+ return ;
+ }
+ if (tab.type === 'sql-analysis') {
+ return ;
+ }
+ if (tab.type === 'jvm-overview') {
+ return ;
+ }
+ if (tab.type === 'jvm-resource') {
+ return ;
+ }
+ if (tab.type === 'jvm-audit') {
+ return ;
+ }
+ if (tab.type === 'jvm-diagnostic') {
+ return ;
+ }
+ if (tab.type === 'jvm-monitoring') {
+ return ;
+ }
+ return null;
+});
+
+WorkbenchTabContent.displayName = 'WorkbenchTabContent';
+
+export default WorkbenchTabContent;
diff --git a/frontend/src/store.test.ts b/frontend/src/store.test.ts
index 831c77f2..7fba51b0 100644
--- a/frontend/src/store.test.ts
+++ b/frontend/src/store.test.ts
@@ -1548,6 +1548,75 @@ describe('store appearance persistence', () => {
});
});
+ it('detaches and restores workbench tabs as floating windows', async () => {
+ const { useStore } = await importStore();
+
+ useStore.getState().addTab({
+ id: 'table-users',
+ title: 'users',
+ type: 'table',
+ connectionId: 'conn-1',
+ dbName: 'sys',
+ tableName: 'users',
+ });
+ useStore.getState().addTab({
+ id: 'query-1',
+ title: '新建查询',
+ type: 'query',
+ connectionId: 'conn-1',
+ dbName: 'sys',
+ query: 'select 1;',
+ });
+
+ useStore.getState().detachWorkbenchTab('table-users', { x: 80, y: 90, width: 800, height: 500 });
+ expect(useStore.getState().isWorkbenchTabDetached('table-users')).toBe(true);
+ expect(useStore.getState().detachedWorkbenchWindows).toEqual([
+ expect.objectContaining({
+ tabId: 'table-users',
+ x: 80,
+ y: 90,
+ width: 800,
+ height: 500,
+ }),
+ ]);
+ expect(useStore.getState().tabs.map((tab) => tab.id)).toEqual(['table-users', 'query-1']);
+
+ useStore.getState().attachWorkbenchTab('table-users');
+ expect(useStore.getState().isWorkbenchTabDetached('table-users')).toBe(false);
+ expect(useStore.getState().detachedWorkbenchWindows).toEqual([]);
+ expect(useStore.getState().activeTabId).toBe('table-users');
+
+ useStore.getState().detachWorkbenchTab('table-users');
+ useStore.getState().closeTab('table-users');
+ expect(useStore.getState().detachedWorkbenchWindows).toEqual([]);
+ expect(useStore.getState().tabs.map((tab) => tab.id)).toEqual(['query-1']);
+ });
+
+ it('detaches and restores query result floating windows', async () => {
+ const { useStore } = await importStore();
+
+ useStore.getState().detachQueryResultWindow({
+ id: 'query-result:tab-1:rs-1',
+ sourceQueryTabId: 'tab-1',
+ connectionId: 'conn-1',
+ dbName: 'sys',
+ title: '结果 1',
+ result: {
+ key: 'rs-1',
+ sql: 'select 1',
+ rows: [{ a: 1 }],
+ columns: ['a'],
+ pkColumns: [],
+ readOnly: true,
+ },
+ });
+ expect(useStore.getState().detachedQueryResultWindows).toHaveLength(1);
+
+ const restored = useStore.getState().attachQueryResultWindow('query-result:tab-1:rs-1');
+ expect(restored?.result.key).toBe('rs-1');
+ expect(useStore.getState().detachedQueryResultWindows).toEqual([]);
+ });
+
it('returns to the source tab after closing an object edit tab opened from a hyperlink', async () => {
const { useStore } = await importStore();
diff --git a/frontend/src/store.ts b/frontend/src/store.ts
index 1809c862..568d9dbb 100644
--- a/frontend/src/store.ts
+++ b/frontend/src/store.ts
@@ -48,6 +48,14 @@ import {
resolveOceanBaseProtocolFromQueryText,
} from "./utils/oceanBaseProtocol";
import { sanitizeFontFamilyInput } from "./utils/fontFamilies";
+import {
+ createDefaultDetachedBounds,
+ nextDetachedZIndex,
+ type DetachedQueryResultWindow,
+ type DetachedWorkbenchWindow,
+ type DetachedWindowBounds,
+} from "./utils/detachedWindow";
+import { clearQueryEditorResultSession } from "./utils/queryEditorResultSessionCache";
import {
DEFAULT_LANGUAGE,
LANGUAGE_PREFERENCES,
@@ -1328,6 +1336,10 @@ interface AppState {
connectionTags: ConnectionTag[];
sidebarRootOrder: string[];
tabs: TabData[];
+ /** 主工作区已拆出的浮动窗口(会话态,不持久化) */
+ detachedWorkbenchWindows: DetachedWorkbenchWindow[];
+ /** SQL 结果区已拆出的浮动窗口(会话态,不持久化) */
+ detachedQueryResultWindows: DetachedQueryResultWindow[];
activeTabId: string | null;
activeContext: { connectionId: string; dbName: string } | null;
savedQueries: SavedQuery[];
@@ -1441,6 +1453,29 @@ interface AppState {
setActiveContext: (
context: { connectionId: string; dbName: string } | null,
) => void;
+ detachWorkbenchTab: (
+ tabId: string,
+ preferred?: Partial>,
+ ) => void;
+ attachWorkbenchTab: (tabId: string) => void;
+ updateDetachedWorkbenchBounds: (
+ tabId: string,
+ bounds: Partial>,
+ ) => void;
+ focusDetachedWorkbenchTab: (tabId: string) => void;
+ isWorkbenchTabDetached: (tabId: string) => boolean;
+ detachQueryResultWindow: (
+ windowState: Omit &
+ Partial>,
+ ) => void;
+ attachQueryResultWindow: (id: string) => DetachedQueryResultWindow | null;
+ closeDetachedQueryResultWindow: (id: string) => void;
+ updateDetachedQueryResultBounds: (
+ id: string,
+ bounds: Partial>,
+ ) => void;
+ focusDetachedQueryResultWindow: (id: string) => void;
+ closeDetachedQueryResultWindowsBySourceTab: (sourceQueryTabId: string) => void;
replaceSavedQueries: (queries: SavedQuery[]) => void;
saveQuery: (query: SavedQuery) => Promise;
@@ -2517,11 +2552,13 @@ export async function loadAISessionFromBackend(
export const useStore = create()(
persist(
- (set) => ({
+ (set, get) => ({
connections: [],
connectionTags: [],
sidebarRootOrder: [],
tabs: [],
+ detachedWorkbenchWindows: [],
+ detachedQueryResultWindows: [],
activeTabId: null,
activeContext: null,
savedQueries: [],
@@ -3061,11 +3098,21 @@ export const useStore = create()(
const closedTab = state.tabs.find((t) => t.id === id);
if (closedTab?.type === "query") {
clearQueryTabDraft(closedTab.id);
+ clearQueryEditorResultSession(id);
}
const newTabs = state.tabs.filter((t) => t.id !== id);
let newActiveId = state.activeTabId;
if (state.activeTabId === id) {
- newActiveId = resolveCloseTabActiveTabId(closedTab, newTabs);
+ // Prefer next docked tab when closing the active one
+ const dockedCandidates = newTabs.filter(
+ (tab) =>
+ !state.detachedWorkbenchWindows.some(
+ (windowState) => windowState.tabId === tab.id,
+ ),
+ );
+ newActiveId =
+ resolveCloseTabActiveTabId(closedTab, dockedCandidates) ||
+ resolveCloseTabActiveTabId(closedTab, newTabs);
}
return {
tabs: newTabs,
@@ -3075,6 +3122,12 @@ export const useStore = create()(
newActiveId,
state.activeContext,
),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => windowState.tabId !== id,
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => windowState.sourceQueryTabId !== id,
+ ),
};
}),
@@ -3084,11 +3137,20 @@ export const useStore = create()(
if (!keep) return state;
state.tabs
.filter((tab) => tab.id !== id && tab.type === "query")
- .forEach((tab) => clearQueryTabDraft(tab.id));
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
return {
tabs: [keep],
activeTabId: id,
activeContext: resolveActiveContextFromTab(keep),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => windowState.tabId === id,
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => windowState.sourceQueryTabId === id,
+ ),
};
}),
@@ -3099,8 +3161,12 @@ export const useStore = create()(
state.tabs
.slice(0, index)
.filter((tab) => tab.type === "query")
- .forEach((tab) => clearQueryTabDraft(tab.id));
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
const newTabs = state.tabs.slice(index);
+ const keptIds = new Set(newTabs.map((tab) => tab.id));
const activeStillExists = state.activeTabId
? newTabs.some((t) => t.id === state.activeTabId)
: false;
@@ -3112,6 +3178,12 @@ export const useStore = create()(
activeStillExists ? state.activeTabId : id,
state.activeContext,
),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => keptIds.has(windowState.tabId),
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => keptIds.has(windowState.sourceQueryTabId),
+ ),
};
}),
@@ -3122,8 +3194,12 @@ export const useStore = create()(
state.tabs
.slice(index + 1)
.filter((tab) => tab.type === "query")
- .forEach((tab) => clearQueryTabDraft(tab.id));
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
const newTabs = state.tabs.slice(0, index + 1);
+ const keptIds = new Set(newTabs.map((tab) => tab.id));
const activeStillExists = state.activeTabId
? newTabs.some((t) => t.id === state.activeTabId)
: false;
@@ -3135,6 +3211,12 @@ export const useStore = create()(
activeStillExists ? state.activeTabId : id,
state.activeContext,
),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => keptIds.has(windowState.tabId),
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => keptIds.has(windowState.sourceQueryTabId),
+ ),
};
}),
@@ -3148,7 +3230,10 @@ export const useStore = create()(
tab.type === "query" &&
String(tab.connectionId || "").trim() === targetConnectionId,
)
- .forEach((tab) => clearQueryTabDraft(tab.id));
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
const newTabs = state.tabs.filter(
(t) => String(t.connectionId || "").trim() !== targetConnectionId,
);
@@ -3164,6 +3249,7 @@ export const useStore = create()(
state.activeContext?.connectionId === targetConnectionId
? null
: state.activeContext;
+ const keptIds = new Set(newTabs.map((tab) => tab.id));
return {
tabs: newTabs,
activeTabId: nextActiveTabId,
@@ -3172,6 +3258,12 @@ export const useStore = create()(
nextActiveTabId,
nextFallbackContext,
),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => keptIds.has(windowState.tabId),
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => keptIds.has(windowState.sourceQueryTabId),
+ ),
};
}),
@@ -3188,7 +3280,10 @@ export const useStore = create()(
const sameDb = String(tab.dbName || "").trim() === targetDbName;
return sameConnection && sameDb;
})
- .forEach((tab) => clearQueryTabDraft(tab.id));
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
const newTabs = state.tabs.filter((tab) => {
const sameConnection =
String(tab.connectionId || "").trim() === targetConnectionId;
@@ -3210,6 +3305,7 @@ export const useStore = create()(
const nextFallbackContext = sameActiveContext
? null
: state.activeContext;
+ const keptIds = new Set(newTabs.map((tab) => tab.id));
return {
tabs: newTabs,
activeTabId: nextActiveTabId,
@@ -3218,6 +3314,12 @@ export const useStore = create()(
nextActiveTabId,
nextFallbackContext,
),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => keptIds.has(windowState.tabId),
+ ),
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => keptIds.has(windowState.sourceQueryTabId),
+ ),
};
}),
@@ -3243,20 +3345,307 @@ export const useStore = create()(
set((state) => {
state.tabs
.filter((tab) => tab.type === "query")
- .forEach((tab) => clearQueryTabDraft(tab.id));
- return { tabs: [], activeTabId: null, activeContext: null };
+ .forEach((tab) => {
+ clearQueryTabDraft(tab.id);
+ clearQueryEditorResultSession(tab.id);
+ });
+ return {
+ tabs: [],
+ activeTabId: null,
+ activeContext: null,
+ detachedWorkbenchWindows: [],
+ detachedQueryResultWindows: [],
+ };
}),
setActiveTab: (id) =>
+ set((state) => {
+ const tabId = String(id || "").trim();
+ const isDetached = state.detachedWorkbenchWindows.some(
+ (windowState) => windowState.tabId === tabId,
+ );
+ if (!isDetached) {
+ return {
+ activeTabId: tabId,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ tabId,
+ state.activeContext,
+ ),
+ };
+ }
+ // Detached tab: keep active context, raise floating window
+ const zIndex = nextDetachedZIndex(state.detachedWorkbenchWindows);
+ return {
+ activeTabId: tabId,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ tabId,
+ state.activeContext,
+ ),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.map(
+ (windowState) =>
+ windowState.tabId === tabId
+ ? { ...windowState, zIndex }
+ : windowState,
+ ),
+ };
+ }),
+ setActiveContext: (context) => set({ activeContext: context }),
+
+ detachWorkbenchTab: (tabId, preferred) =>
+ set((state) => {
+ const id = String(tabId || "").trim();
+ if (!id || !state.tabs.some((tab) => tab.id === id)) {
+ return state;
+ }
+ const existing = state.detachedWorkbenchWindows.find(
+ (windowState) => windowState.tabId === id,
+ );
+ if (existing) {
+ const zIndex = nextDetachedZIndex(state.detachedWorkbenchWindows);
+ return {
+ activeTabId: id,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ id,
+ state.activeContext,
+ ),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.map(
+ (windowState) =>
+ windowState.tabId === id
+ ? { ...windowState, zIndex }
+ : windowState,
+ ),
+ };
+ }
+ const bounds = createDefaultDetachedBounds(
+ state.detachedWorkbenchWindows,
+ preferred,
+ );
+ const detachedTab = state.tabs.find((tab) => tab.id === id);
+ return {
+ detachedWorkbenchWindows: [
+ ...state.detachedWorkbenchWindows,
+ { tabId: id, ...bounds },
+ ],
+ // Keep detached tab active so connection context and focus stay correct;
+ // TabManager only renders docked tabs and falls back visually.
+ activeTabId: id,
+ activeContext: resolveActiveContextFromTab(detachedTab) ||
+ resolveActiveContextForTabId(
+ state.tabs,
+ id,
+ state.activeContext,
+ ),
+ };
+ }),
+
+ attachWorkbenchTab: (tabId) =>
+ set((state) => {
+ const id = String(tabId || "").trim();
+ if (!id) return state;
+ if (
+ !state.detachedWorkbenchWindows.some(
+ (windowState) => windowState.tabId === id,
+ )
+ ) {
+ return {
+ activeTabId: id,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ id,
+ state.activeContext,
+ ),
+ };
+ }
+ return {
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.filter(
+ (windowState) => windowState.tabId !== id,
+ ),
+ activeTabId: id,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ id,
+ state.activeContext,
+ ),
+ };
+ }),
+
+ updateDetachedWorkbenchBounds: (tabId, bounds) =>
+ set((state) => {
+ const id = String(tabId || "").trim();
+ if (!id) return state;
+ return {
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.map(
+ (windowState) =>
+ windowState.tabId === id
+ ? {
+ ...windowState,
+ ...(bounds.x !== undefined ? { x: bounds.x } : {}),
+ ...(bounds.y !== undefined ? { y: bounds.y } : {}),
+ ...(bounds.width !== undefined
+ ? { width: bounds.width }
+ : {}),
+ ...(bounds.height !== undefined
+ ? { height: bounds.height }
+ : {}),
+ }
+ : windowState,
+ ),
+ };
+ }),
+
+ focusDetachedWorkbenchTab: (tabId) =>
+ set((state) => {
+ const id = String(tabId || "").trim();
+ if (
+ !id ||
+ !state.detachedWorkbenchWindows.some(
+ (windowState) => windowState.tabId === id,
+ )
+ ) {
+ return state;
+ }
+ const zIndex = nextDetachedZIndex(state.detachedWorkbenchWindows);
+ return {
+ activeTabId: id,
+ activeContext: resolveActiveContextForTabId(
+ state.tabs,
+ id,
+ state.activeContext,
+ ),
+ detachedWorkbenchWindows: state.detachedWorkbenchWindows.map(
+ (windowState) =>
+ windowState.tabId === id
+ ? { ...windowState, zIndex }
+ : windowState,
+ ),
+ };
+ }),
+
+ isWorkbenchTabDetached: (tabId): boolean => {
+ const id = String(tabId || "").trim();
+ return get().detachedWorkbenchWindows.some(
+ (windowState) => windowState.tabId === id,
+ );
+ },
+
+ detachQueryResultWindow: (windowState) =>
+ set((state) => {
+ const id = String(windowState.id || "").trim();
+ if (!id) return state;
+ const existingIndex = state.detachedQueryResultWindows.findIndex(
+ (item) => item.id === id,
+ );
+ if (existingIndex >= 0) {
+ const zIndex = nextDetachedZIndex(state.detachedQueryResultWindows);
+ const next = [...state.detachedQueryResultWindows];
+ next[existingIndex] = {
+ ...next[existingIndex],
+ ...windowState,
+ zIndex,
+ };
+ return { detachedQueryResultWindows: next };
+ }
+ const bounds = createDefaultDetachedBounds(
+ state.detachedQueryResultWindows,
+ windowState,
+ );
+ return {
+ detachedQueryResultWindows: [
+ ...state.detachedQueryResultWindows,
+ {
+ id,
+ sourceQueryTabId: String(windowState.sourceQueryTabId || ""),
+ connectionId: String(windowState.connectionId || ""),
+ dbName: windowState.dbName,
+ title: String(windowState.title || id),
+ result: windowState.result,
+ ...bounds,
+ },
+ ],
+ };
+ }),
+
+ attachQueryResultWindow: (id) => {
+ const windowId = String(id || "").trim();
+ if (!windowId) return null;
+ const current = get().detachedQueryResultWindows;
+ const found =
+ current.find((windowState) => windowState.id === windowId) || null;
+ if (!found) return null;
+ set({
+ detachedQueryResultWindows: current.filter(
+ (windowState) => windowState.id !== windowId,
+ ),
+ });
+ return found;
+ },
+
+ closeDetachedQueryResultWindow: (id) =>
set((state) => ({
- activeTabId: id,
- activeContext: resolveActiveContextForTabId(
- state.tabs,
- id,
- state.activeContext,
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => windowState.id !== String(id || "").trim(),
),
})),
- setActiveContext: (context) => set({ activeContext: context }),
+
+ updateDetachedQueryResultBounds: (id, bounds) =>
+ set((state) => {
+ const windowId = String(id || "").trim();
+ if (!windowId) return state;
+ return {
+ detachedQueryResultWindows: state.detachedQueryResultWindows.map(
+ (windowState) =>
+ windowState.id === windowId
+ ? {
+ ...windowState,
+ ...(bounds.x !== undefined ? { x: bounds.x } : {}),
+ ...(bounds.y !== undefined ? { y: bounds.y } : {}),
+ ...(bounds.width !== undefined
+ ? { width: bounds.width }
+ : {}),
+ ...(bounds.height !== undefined
+ ? { height: bounds.height }
+ : {}),
+ }
+ : windowState,
+ ),
+ };
+ }),
+
+ focusDetachedQueryResultWindow: (id) =>
+ set((state) => {
+ const windowId = String(id || "").trim();
+ if (
+ !windowId ||
+ !state.detachedQueryResultWindows.some(
+ (windowState) => windowState.id === windowId,
+ )
+ ) {
+ return state;
+ }
+ const zIndex = nextDetachedZIndex(state.detachedQueryResultWindows);
+ return {
+ detachedQueryResultWindows: state.detachedQueryResultWindows.map(
+ (windowState) =>
+ windowState.id === windowId
+ ? { ...windowState, zIndex }
+ : windowState,
+ ),
+ };
+ }),
+
+ closeDetachedQueryResultWindowsBySourceTab: (sourceQueryTabId) =>
+ set((state) => {
+ const sourceId = String(sourceQueryTabId || "").trim();
+ if (!sourceId) return state;
+ return {
+ detachedQueryResultWindows: state.detachedQueryResultWindows.filter(
+ (windowState) => windowState.sourceQueryTabId !== sourceId,
+ ),
+ };
+ }),
replaceSavedQueries: (queries) =>
set({ savedQueries: sanitizeSavedQueries(queries) }),
@@ -3957,6 +4346,9 @@ export const useStore = create()(
connectionTags: persistedConnectionTags,
sidebarRootOrder: persistedSidebarRootOrder,
tabs: safeTabs,
+ // Floating windows are session-only and must not be restored from disk.
+ detachedWorkbenchWindows: [],
+ detachedQueryResultWindows: [],
activeTabId: sanitizeActiveTabId(state.activeTabId, safeTabs),
savedQueries: currentState.savedQueries,
externalSQLDirectories: sanitizeExternalSQLDirectories(
diff --git a/frontend/src/utils/detachedWindow.test.ts b/frontend/src/utils/detachedWindow.test.ts
new file mode 100644
index 00000000..fb654bcf
--- /dev/null
+++ b/frontend/src/utils/detachedWindow.test.ts
@@ -0,0 +1,40 @@
+import { describe, expect, it } from 'vitest';
+import {
+ createDefaultDetachedBounds,
+ DETACH_TAB_DRAG_Y_THRESHOLD,
+ nextDetachedZIndex,
+ resolveDetachedWindowTitle,
+ shouldDetachTabByDrag,
+} from './detachedWindow';
+
+describe('detachedWindow helpers', () => {
+ it('computes next z-index above existing windows', () => {
+ expect(nextDetachedZIndex([])).toBe(1201);
+ expect(nextDetachedZIndex([{ zIndex: 1300 }, { zIndex: 1250 }])).toBe(1301);
+ });
+
+ it('detaches only when vertical drag exceeds threshold', () => {
+ expect(shouldDetachTabByDrag(DETACH_TAB_DRAG_Y_THRESHOLD - 1)).toBe(false);
+ expect(shouldDetachTabByDrag(DETACH_TAB_DRAG_Y_THRESHOLD)).toBe(true);
+ expect(shouldDetachTabByDrag(-DETACH_TAB_DRAG_Y_THRESHOLD)).toBe(true);
+ });
+
+ it('builds a default floating window bounds', () => {
+ const bounds = createDefaultDetachedBounds([]);
+ expect(bounds.width).toBeGreaterThan(0);
+ expect(bounds.height).toBeGreaterThan(0);
+ expect(bounds.zIndex).toBeGreaterThan(1200);
+ });
+
+ it('resolves floating window titles with object labels', () => {
+ expect(resolveDetachedWindowTitle({
+ kindLabel: '表数据',
+ objectLabel: 'users',
+ fallbackTitle: 'users',
+ })).toBe('表数据 · users');
+ expect(resolveDetachedWindowTitle({
+ kindLabel: 'SQL 查询',
+ fallbackTitle: 'Query 1',
+ })).toBe('Query 1');
+ });
+});
diff --git a/frontend/src/utils/detachedWindow.ts b/frontend/src/utils/detachedWindow.ts
new file mode 100644
index 00000000..dd00bb4f
--- /dev/null
+++ b/frontend/src/utils/detachedWindow.ts
@@ -0,0 +1,129 @@
+export type DetachedWindowBounds = {
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ zIndex: number;
+};
+
+export type DetachedWorkbenchWindow = DetachedWindowBounds & {
+ tabId: string;
+};
+
+export type DetachedQueryResultSnapshot = {
+ key: string;
+ sql: string;
+ exportSql?: string;
+ sourceStatementIndex?: number;
+ statementResultIndex?: number;
+ rows: any[];
+ columns: string[];
+ messages?: string[];
+ resultType?: 'grid' | 'message';
+ tableName?: string;
+ pkColumns: string[];
+ editLocator?: {
+ strategy?: string;
+ columns?: string[];
+ values?: Record;
+ };
+ readOnly: boolean;
+ showRowNumberColumn?: boolean;
+ truncated?: boolean;
+};
+
+export type DetachedQueryResultWindow = DetachedWindowBounds & {
+ id: string;
+ sourceQueryTabId: string;
+ connectionId: string;
+ dbName?: string;
+ title: string;
+ result: DetachedQueryResultSnapshot;
+};
+
+export const DETACH_TAB_DRAG_Y_THRESHOLD = 56;
+export const DEFAULT_DETACHED_WINDOW_WIDTH = 960;
+export const DEFAULT_DETACHED_WINDOW_HEIGHT = 640;
+export const DEFAULT_DETACHED_WINDOW_MIN_WIDTH = 480;
+export const DEFAULT_DETACHED_WINDOW_MIN_HEIGHT = 320;
+export const DETACHED_WINDOW_VIEWPORT_PADDING = 16;
+
+export const clamp = (value: number, min: number, max: number): number =>
+ Math.min(Math.max(value, min), max);
+
+export const nextDetachedZIndex = (windows: Array<{ zIndex?: number }>): number => {
+ let max = 1200;
+ for (const windowState of windows) {
+ const z = Number(windowState?.zIndex);
+ if (Number.isFinite(z) && z > max) {
+ max = z;
+ }
+ }
+ return max + 1;
+};
+
+const getViewportSize = () => {
+ if (typeof window === 'undefined') {
+ return {
+ width: DEFAULT_DETACHED_WINDOW_WIDTH + DETACHED_WINDOW_VIEWPORT_PADDING * 2,
+ height: DEFAULT_DETACHED_WINDOW_HEIGHT + DETACHED_WINDOW_VIEWPORT_PADDING * 2,
+ };
+ }
+ return {
+ width: window.innerWidth,
+ height: window.innerHeight,
+ };
+};
+
+export const createDefaultDetachedBounds = (
+ windows: Array<{ zIndex?: number }>,
+ preferred?: Partial>,
+): DetachedWindowBounds => {
+ const viewport = getViewportSize();
+ const width = clamp(
+ Number(preferred?.width) || DEFAULT_DETACHED_WINDOW_WIDTH,
+ DEFAULT_DETACHED_WINDOW_MIN_WIDTH,
+ Math.max(DEFAULT_DETACHED_WINDOW_MIN_WIDTH, viewport.width - DETACHED_WINDOW_VIEWPORT_PADDING * 2),
+ );
+ const height = clamp(
+ Number(preferred?.height) || DEFAULT_DETACHED_WINDOW_HEIGHT,
+ DEFAULT_DETACHED_WINDOW_MIN_HEIGHT,
+ Math.max(DEFAULT_DETACHED_WINDOW_MIN_HEIGHT, viewport.height - DETACHED_WINDOW_VIEWPORT_PADDING * 2),
+ );
+ const cascade = (windows.length % 8) * 28;
+ const defaultX = Math.max(
+ DETACHED_WINDOW_VIEWPORT_PADDING,
+ Math.round((viewport.width - width) / 2) + cascade,
+ );
+ const defaultY = Math.max(
+ DETACHED_WINDOW_VIEWPORT_PADDING,
+ Math.round((viewport.height - height) / 2) + cascade,
+ );
+ const maxX = Math.max(DETACHED_WINDOW_VIEWPORT_PADDING, viewport.width - width - DETACHED_WINDOW_VIEWPORT_PADDING);
+ const maxY = Math.max(DETACHED_WINDOW_VIEWPORT_PADDING, viewport.height - height - DETACHED_WINDOW_VIEWPORT_PADDING);
+ return {
+ x: clamp(Number.isFinite(Number(preferred?.x)) ? Number(preferred?.x) : defaultX, DETACHED_WINDOW_VIEWPORT_PADDING, maxX),
+ y: clamp(Number.isFinite(Number(preferred?.y)) ? Number(preferred?.y) : defaultY, DETACHED_WINDOW_VIEWPORT_PADDING, maxY),
+ width,
+ height,
+ zIndex: nextDetachedZIndex(windows),
+ };
+};
+
+export const shouldDetachTabByDrag = (deltaY: number, overId?: string | null): boolean => {
+ if (!Number.isFinite(deltaY)) return false;
+ // 垂直拖出超过阈值即判定为独立窗口;即使仍 hover 在其他 tab 上也可拆出
+ return Math.abs(deltaY) >= DETACH_TAB_DRAG_Y_THRESHOLD;
+};
+
+export const resolveDetachedWindowTitle = (params: {
+ kindLabel: string;
+ objectLabel?: string;
+ fallbackTitle: string;
+}): string => {
+ const objectLabel = String(params.objectLabel || '').trim();
+ if (objectLabel) {
+ return `${params.kindLabel} · ${objectLabel}`;
+ }
+ return String(params.fallbackTitle || params.kindLabel || '').trim() || params.kindLabel;
+};
diff --git a/frontend/src/utils/queryEditorResultSessionCache.ts b/frontend/src/utils/queryEditorResultSessionCache.ts
new file mode 100644
index 00000000..ca2cc628
--- /dev/null
+++ b/frontend/src/utils/queryEditorResultSessionCache.ts
@@ -0,0 +1,48 @@
+import type { QueryEditorResultSet } from '../components/QueryEditorResultsPanel';
+
+type QueryEditorResultSessionSnapshot = {
+ resultSets: QueryEditorResultSet[];
+ activeResultKey: string;
+ isResultPanelVisible?: boolean;
+};
+
+const cache = new Map();
+
+export const saveQueryEditorResultSession = (
+ tabId: string,
+ snapshot: QueryEditorResultSessionSnapshot,
+): void => {
+ const id = String(tabId || '').trim();
+ if (!id) return;
+ cache.set(id, {
+ resultSets: Array.isArray(snapshot.resultSets) ? snapshot.resultSets : [],
+ activeResultKey: String(snapshot.activeResultKey || ''),
+ isResultPanelVisible: snapshot.isResultPanelVisible,
+ });
+};
+
+export const takeQueryEditorResultSession = (
+ tabId: string,
+): QueryEditorResultSessionSnapshot | null => {
+ const id = String(tabId || '').trim();
+ if (!id) return null;
+ const snapshot = cache.get(id) || null;
+ if (snapshot) {
+ cache.delete(id);
+ }
+ return snapshot;
+};
+
+export const peekQueryEditorResultSession = (
+ tabId: string,
+): QueryEditorResultSessionSnapshot | null => {
+ const id = String(tabId || '').trim();
+ if (!id) return null;
+ return cache.get(id) || null;
+};
+
+export const clearQueryEditorResultSession = (tabId: string): void => {
+ const id = String(tabId || '').trim();
+ if (!id) return;
+ cache.delete(id);
+};
diff --git a/shared/i18n/de-DE.json b/shared/i18n/de-DE.json
index 7a677220..7ab13f4c 100644
--- a/shared/i18n/de-DE.json
+++ b/shared/i18n/de-DE.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "Claude Code-Konfigurationsverzeichnis konnte nicht erstellt werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Das Format der Claude Code-Konfiguration ist ungültig: {{path}} muss {{expected}} sein",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "Claude Code-Konfiguration konnte nicht geparst werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "Claude Code-Konfiguration konnte nicht gefunden werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "Claude Code-Konfiguration konnte nicht gelesen werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "Claude Code-Konfiguration konnte nicht serialisiert werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "Claude Code-Konfiguration konnte nicht geschrieben werden: {{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "Die MCP-Konfiguration auf Benutzerebene für Claude Code wurde geschrieben. Starten Sie Claude CLI neu; GoNavi erscheint dann unter User MCPs in /mcp.",
+ "ai.service.mcp_client.claude_code.status.connected": "Die GoNavi MCP-Konfiguration auf Benutzerebene für Claude Code wurde erkannt und passt zum aktuellen GoNavi-Installationspfad",
+ "ai.service.mcp_client.claude_code.status.missing": "Keine GoNavi MCP-Konfiguration auf Benutzerebene für Claude Code erkannt",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "In Claude Code wurde ein GoNavi MCP-Eintrag erkannt, aber die Prüfung des aktuellen GoNavi-Installationspfads ist fehlgeschlagen: {{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "In Claude Code wurde ein GoNavi MCP-Eintrag erkannt, der nicht zum aktuellen GoNavi-Installationspfad passt. Eine Aktualisierung wird empfohlen.",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "Codex-Konfigurationsverzeichnis konnte nicht erstellt werden: {{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Das Format der Codex-Konfiguration ist ungültig: {{path}} konnte nicht als {{expected}} gelesen werden",
+ "ai.service.mcp_client.codex.config_path_failed": "Codex-Konfiguration konnte nicht gefunden werden: {{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "Codex-Konfiguration konnte nicht gelesen werden: {{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "Codex-Konfiguration konnte nicht geschrieben werden: {{detail}}",
+ "ai.service.mcp_client.codex.install_success": "Die MCP-Konfiguration auf Benutzerebene für Codex wurde geschrieben. Starten Sie Codex CLI oder die Desktop-App neu, um GoNavi zu sehen.",
+ "ai.service.mcp_client.codex.status.connected": "Die GoNavi MCP-Konfiguration auf Benutzerebene für Codex wurde erkannt und passt zum aktuellen GoNavi-Installationspfad",
+ "ai.service.mcp_client.codex.status.missing": "Keine GoNavi MCP-Konfiguration auf Benutzerebene für Codex erkannt",
+ "ai.service.mcp_client.codex.status.path_check_failed": "In Codex wurde ein GoNavi MCP-Eintrag erkannt, aber die Prüfung des aktuellen GoNavi-Installationspfads ist fehlgeschlagen: {{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "In Codex wurde ein GoNavi MCP-Eintrag erkannt, der nicht zum aktuellen GoNavi-Installationspfad passt. Eine Aktualisierung wird empfohlen.",
+ "ai.service.mcp_client.executable_path_empty": "Der Pfad zur aktuellen GoNavi-Programmdatei ist leer",
+ "ai.service.mcp_client.executable_path_failed": "Die aktuelle GoNavi-Programmdatei konnte nicht gefunden werden: {{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} läuft normalerweise in der Cloud oder in einer Remote-Umgebung. Binden Sie es über eine Remote-MCP-Brücke an Windows GoNavi an; Datenbankpasswörter bleiben auf diesem GoNavi-Rechner.",
+ "ai.service.mcp_client.user_home_dir_unavailable": "Das aktuelle Benutzer-Home-Verzeichnis konnte nicht ermittelt werden",
"ai_chat.builtin_tools.database.execute_sql.desc": "Execute a SQL query and return results",
"ai_chat.builtin_tools.database.execute_sql.detail": "Pass connectionId, dbName, and sql, then execute SQL on the target database and return results (up to 50 rows). Controlled by safety level; read-only mode only allows SELECT/SHOW/DESCRIBE.",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "Connection ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "Neuer Chat",
"ai_chat.header.export_time": "Exportiert am:",
"ai_chat.header.export_user": "Sie",
- "ai_chat.header.mode_tabs.aria_label": "AI-Arbeitsmodus",
"ai_chat.header.mode.chat": "Chat",
"ai_chat.header.mode.history": "Verlauf",
"ai_chat.header.mode.insights": "Auto-Insights",
+ "ai_chat.header.mode_tabs.aria_label": "AI-Arbeitsmodus",
"ai_chat.header.session.connected": "{{title}} · Verbunden",
"ai_chat.header.tooltip.close": "Panel schließen",
"ai_chat.header.tooltip.export_markdown": "Als Markdown exportieren",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "Gleiche messageId und contentPreview mit der aktuellen Unterhaltung ab, um die betroffene Antwortblase zu identifizieren.",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "Wenn die Eingrenzung weitergehen muss, vergleiche die letzte Nutzereingabe, Tool-Ergebnisse und den zugehörigen Komponentencode.",
"ai_chat.inspection.last_render_error.recorded_summary": "Ein aktueller Rendering-Fehler einer AI-Nachricht wurde aufgezeichnet, inklusive Nachricht, Rendering-Pfad und Stack-Zusammenfassung für die Diagnose.",
+ "ai_chat.inspection.mcp.message.configured": "{{serverCount}} MCP-Server ist konfiguriert; {{enabledCount}} aktiviert",
+ "ai_chat.inspection.mcp.message.empty": "Es sind noch keine MCP-Server konfiguriert",
+ "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} MCP-Server ist konfiguriert; {{enabledCount}} aktiviert; {{issueCount}} Konfigurationsprüfungen benötigen Aufmerksamkeit",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "Behebe zuerst die MCP-Server-Konfigurationsfehler und teste den Server danach erneut",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Öffne den betroffenen MCP-Server und trenne Startbefehl, Argumente und Timeout gemäß den Konfigurationshinweisen",
+ "ai_chat.inspection.mcp.warning.config_errors": "{{count}} MCP-Server hat Fehler in der Startkonfiguration; Tests und Tool-Erkennung können fehlschlagen",
+ "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} MCP-Server hat Warnungen in der Startkonfiguration; vor der Diagnose fehlgeschlagener Tool-Erkennung prüfen",
"ai_chat.inspection.mcp_docker.message.empty": "Es sind keine Docker MCP-Server konfiguriert",
"ai_chat.inspection.mcp_docker.message.with_enabled": "Es gibt {{total}} Docker MCP-Server; {{enabled}} sind aktiviert",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "Es gibt {{total}} Docker MCP-Server; bei {{count}} sind wichtige Argumente unvollständig",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "Einige MCP-Tools deklarieren kein inputSchema, daher kann die Parameterdokumentation unvollständig sein.",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "Kein passendes MCP-Tool gefunden.",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "Es wurden keine MCP-Tools erkannt; eventuell sind keine MCP-Services konfiguriert oder Service-Test/Erkennung ist fehlgeschlagen.",
- "ai_chat.inspection.mcp.message.configured": "{{serverCount}} MCP-Server ist konfiguriert; {{enabledCount}} aktiviert",
- "ai_chat.inspection.mcp.message.empty": "Es sind noch keine MCP-Server konfiguriert",
- "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} MCP-Server ist konfiguriert; {{enabledCount}} aktiviert; {{issueCount}} Konfigurationsprüfungen benötigen Aufmerksamkeit",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "Behebe zuerst die MCP-Server-Konfigurationsfehler und teste den Server danach erneut",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Öffne den betroffenen MCP-Server und trenne Startbefehl, Argumente und Timeout gemäß den Konfigurationshinweisen",
- "ai_chat.inspection.mcp.warning.config_errors": "{{count}} MCP-Server hat Fehler in der Startkonfiguration; Tests und Tool-Erkennung können fehlschlagen",
- "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} MCP-Server hat Warnungen in der Startkonfiguration; vor der Diagnose fehlgeschlagener Tool-Erkennung prüfen",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "Prüfe, ob Ausnahme- oder Abbruchpfade leere assistant-Platzhalternachrichten hinterlassen haben.",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "Prüfe, ob die Streaming-Append-Logik dieselbe assistantMsgId wiederverwendet, statt für dieselbe Antwort eine neue assistant-Nachricht anzulegen.",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "Prüfe zuerst, ob useAIChatLocalTools für jede tool_call_id eine tool-Nachricht schreibt.",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "Returns whether the current chat input has all prerequisites to send, including active provider, missing key or endpoint on the current provider, selected model, current connection context, attached table context, and next actions. Use it when users ask why sending is disabled or what the chat input is missing.",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "No parameters",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "Read the send-prerequisite state of the current AI chat input, including active provider, key and endpoint completeness, selected model, current connection context, attached table schema count, and suggested next actions.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "AI-Kontextgröße und Stabilitätsrisiko diagnostizieren",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "Schätzt aktuelle Nachrichten, Tool-Ergebnisse, angehängte Tabellen-DDL, MCP tool schemas, Nutzerprompts und Skills in der aktuellen oder angegebenen AI-Sitzung und gibt low/medium/high/critical-Risiko, Hauptquellen und Eingrenzungsvorschläge zurück.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "Optional. Ob größte Nachricht, größte DDL-Tabelle und größtes MCP schema enthalten sind. Standard true.",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "Optional. Zu diagnostizierende AI session ID. Ohne Wert wird die aktuelle aktive Sitzung verwendet.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(Standard aktuelle Sitzung), messageLimit?(Standard 40), includeDetails?(Standard true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "Liest einen Snapshot zu AI-Kontextgröße und Stabilitätsrisiko mit Nachrichtenfenster, Tool-Ergebnislänge, angehängter Tabellen-DDL, MCP tool schemas, Nutzerprompts und aktivierten Skills.",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "Inspect current AI prompts and Skills configuration",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "Returns current user-defined global, database, and JVM prompts, plus enabled Skills, scopes, dependency tools, and skill prompt content. Use it when users ask which prompts are currently attached, why AI answers this way, or which Skills are active.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "No parameters",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "Verbindungsstatus des externen Tools: nicht verbunden",
"ai_chat.mcp_client.install.state.remote": "Verbindungsstatus des externen Tools: Remote-MCP-Bridge erforderlich",
"ai_chat.mcp_client.install.state.stale": "Verbindungsstatus des externen Tools: alte Konfiguration gefunden, Update nötig",
- "ai_chat.mcp_client.install.status_tone.connected": "Verbunden",
- "ai_chat.mcp_client.install.status_tone.not_connected": "Nicht verbunden",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "Remote-Bridge",
- "ai_chat.mcp_client.install.status_tone.status_error": "Statusfehler",
- "ai_chat.mcp_client.install.status_tone.update_required": "Update nötig",
- "ai_chat.mcp_client.install.status.cli_prefix": "CLI-Erkennung: {{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "{{command}} erkannt",
"ai_chat.mcp_client.install.status.cli.not_detected": "{{command}} wurde nicht erkannt; Konfiguration kann trotzdem zuerst geschrieben werden",
"ai_chat.mcp_client.install.status.cli.remote": "Remote-Agent benötigt keine lokale Erkennung des Befehls {{command}}",
+ "ai_chat.mcp_client.install.status.cli_prefix": "CLI-Erkennung: {{status}}",
"ai_chat.mcp_client.install.status.command_path": "Befehlspfad: {{path}}",
"ai_chat.mcp_client.install.status.config_file": "Konfigurationsdatei: {{path}}",
"ai_chat.mcp_client.install.status.copy_command": "Startbefehl kopieren",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "Status aktualisieren",
"ai_chat.mcp_client.install.status.remote_boundary": "Remote-Verbindungsgrenze: Datenbankverbindungsdaten und Passwörter bleiben in Windows GoNavi. Cloud-Agents lesen Verbindungszusammenfassungen, Objektlisten, Tabellen, Views und DDL standardmäßig über schema-only MCP-Tools; execute_sql wird nicht registriert. Für maschinenübergreifenden Zugriff GoNavi Streamable HTTP mit token, Tunnel oder Reverse Proxy verwenden.",
"ai_chat.mcp_client.install.status.title": "Status des ausgewählten Clients",
+ "ai_chat.mcp_client.install.status_tone.connected": "Verbunden",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "Nicht verbunden",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "Remote-Bridge",
+ "ai_chat.mcp_client.install.status_tone.status_error": "Statusfehler",
+ "ai_chat.mcp_client.install.status_tone.update_required": "Update nötig",
"ai_chat.mcp_client.install.summary.connected": "{{label}} ist mit diesem GoNavi MCP verbunden und kann es direkt aufrufen.",
"ai_chat.mcp_client.install.summary.error": "Der Verbindungsstatus für {{label}} konnte nicht gelesen werden. Aktualisiere zuerst die Erkennung.",
"ai_chat.mcp_client.install.summary.missing": "Dieses GoNavi MCP ist noch nicht mit {{label}} verbunden.",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "Datenbankobjektliste lesen",
"ai_chat.message.tool_call.get_table_ddl": "CREATE TABLE-Anweisung extrahieren",
"ai_chat.message.tool_call.get_tables": "Tabellenstrukturinformationen analysieren",
- "ai_chat.message.tool_call.get_views": "View-Strukturinformationen analysieren",
"ai_chat.message.tool_call.get_triggers": "Triggerlogik prüfen",
+ "ai_chat.message.tool_call.get_views": "View-Strukturinformationen analysieren",
"ai_chat.message.tool_call.inspect_active_tab": "Aktiven Tab lesen",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "Aktuellen AI-Chat-Vorbereitungsstatus lesen",
"ai_chat.message.tool_call.inspect_ai_context_budget": "Risiko des AI-Kontextumfangs diagnostizieren",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "erlaubt",
"ai_chat.system.context.permission.denied": "verboten",
"ai_chat.system.context.skill_prompt": "Der aktive Skill \"{{skillName}}\" ({{skillDescription}}) gilt fuer diese Antwort. Befolge seine Einschraenkungen und Arbeitsweise:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "Der aktive Skill \"{{skillName}}\" gilt fuer diese Antwort. Befolge seine Einschraenkungen und Arbeitsweise:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\nAbhaengige Tools: {{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "Der aktive Skill \"{{skillName}}\" gilt fuer diese Antwort. Befolge seine Einschraenkungen und Arbeitsweise:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "Bei Fragen zu Sendebereitschaft und fehlender AI-Chat-Konfiguration zuerst inspect_ai_chat_readiness aufrufen, den echten GoNavi Zustand lesen und nicht aus Erinnerung oder UI-Vermutungen antworten.",
"ai_chat.system.inspection_guidance.inspect_ai_context": "Bei Fragen zu AI-Kontext, zugeordneten Tabellen oder eingebundenen Tabellenschemata zuerst inspect_ai_context aufrufen, den echten GoNavi Zustand lesen und nicht aus Erinnerung oder UI-Vermutungen antworten.",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "Bei Fragen zu zu grossem Kontext, langen Tool-Ergebnissen oder instabilen Modellantworten zuerst inspect_ai_context_budget aufrufen, den echten GoNavi Zustand lesen und nicht aus Erinnerung oder UI-Vermutungen antworten.",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "Bitte eine gültige Endpunkt-URL eingeben",
"ai_settings.form.api_format": "API-Format",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "Leer lassen, um das auf diesem Rechner angemeldete CodeBuddy-CLI-Konto zu verwenden; bei Eingabe wird die aktuelle Anmeldeinformation bevorzugt.",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (optional)",
"ai_settings.form.api_key_keep_placeholder": "Leer lassen, um das gespeicherte Secret weiterzuverwenden",
"ai_settings.form.api_key_placeholder": "sk-... / Ihr API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "Leer lassen, um die lokale Anmeldung zu verwenden, oder API Key / Token zum Überschreiben eingeben",
"ai_settings.form.api_key_required": "Bitte API Key eingeben",
"ai_settings.form.api_key_saved_hint": "Ein API Key ist bereits gespeichert. Leer lassen, um ihn weiterzuverwenden, oder einen neuen Wert zum Ersetzen eingeben.",
- "ai_settings.form.api_key.codebuddy_hint": "Leer lassen, um das auf diesem Rechner angemeldete CodeBuddy-CLI-Konto zu verwenden; bei Eingabe wird die aktuelle Anmeldeinformation bevorzugt.",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (optional)",
"ai_settings.form.clear_saved_api_key": "Gespeicherten API Key löschen",
+ "ai_settings.form.inline_completion_model": "Autovervollständigungsmodell",
+ "ai_settings.form.inline_completion_model_hint": "Wähle ein kleineres, schnelleres Modell für SQL-Editor-Geistervorschläge. Leer lassen, um dem Chatmodell zu folgen.",
+ "ai_settings.form.inline_completion_model_placeholder": "Chatmodell verwenden",
"ai_settings.form.model_list": "Verfügbare Modellliste (optional)",
"ai_settings.form.model_list_placeholder": "Modell-IDs konfigurieren; leer lassen, um sie vom Server abzurufen",
"ai_settings.form.model_list_placeholder.codebuddy": "Optional: Häufige Modelle vorab eintragen; leer lassen, damit CodeBuddy CLI oder der Dienst automatisch wählt",
"ai_settings.form.model_list_placeholder.cursor": "Optional: Häufige Cursor-Modell-IDs vorab eintragen; leer lassen, damit automatisch das Standardmodell von Cursor gewählt wird",
- "ai_settings.form.inline_completion_model": "Autovervollständigungsmodell",
- "ai_settings.form.inline_completion_model_hint": "Wähle ein kleineres, schnelleres Modell für SQL-Editor-Geistervorschläge. Leer lassen, um dem Chatmodell zu folgen.",
- "ai_settings.form.inline_completion_model_placeholder": "Chatmodell verwenden",
"ai_settings.form.provider_name": "Anbietername",
"ai_settings.form.provider_name_placeholder": "Beispiel: eigener OpenAI-kompatibler Endpunkt / privates Modell",
"ai_settings.form.provider_name_required": "Bitte einen Namen eingeben",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "GoNavi MCP HTTP-Dienst läuft nicht",
"ai_settings.mcp_server.argument_hints.action_separator": "; ",
"ai_settings.mcp_server.argument_hints.argument_details": "Argumente einzeln erklärt",
- "ai_settings.mcp_server.argument_hints.business_arguments": "Erkannte fachliche Argumente",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "Übergib Authentifizierungsdaten nur, wenn das README ein Befehlsargument verlangt; bevorzuge Umgebungsvariablen.",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "Zugriffstoken",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "Trage den echten Wert lokal ein; nicht in Chat oder Screenshots einfügen.",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "Gibt eine Serviceadresse oder einen API-Einstiegspunkt für den MCP-Dienst an.",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "Basis-URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "Gib die vollständige Adresse ein, ohne Geheimnisse in die URL einzubauen.",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Verweist auf lokale Dateien, Verzeichnisse, Repositories oder Programme für den MCP-Dienst.",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "Konfigurationsdatei",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Nutze einen absoluten lokalen Pfad und den kleinstmöglichen Umfang.",
"ai_settings.mcp_server.argument_hints.business.config.detail": "Verweist auf lokale Dateien, Verzeichnisse, Repositories oder Programme für den MCP-Dienst.",
"ai_settings.mcp_server.argument_hints.business.config.label": "Konfigurationsdatei",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "Nutze einen absoluten lokalen Pfad und den kleinstmöglichen Umfang.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Verweist auf lokale Dateien, Verzeichnisse, Repositories oder Programme für den MCP-Dienst.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "Konfigurationsdatei",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Nutze einen absoluten lokalen Pfad und den kleinstmöglichen Umfang.",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "Verweist auf lokale Dateien, Verzeichnisse, Repositories oder Programme für den MCP-Dienst.",
"ai_settings.mcp_server.argument_hints.business.dir.label": "Verzeichnis",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "Nutze einen absoluten lokalen Pfad und den kleinstmöglichen Umfang.",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "Verweist auf lokale Dateien, Verzeichnisse, Repositories oder Programme für den MCP-Dienst.",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "Arbeitsbereichsverzeichnis",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "Nutze einen absoluten lokalen Pfad und den kleinstmöglichen Umfang.",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "Erkannte fachliche Argumente",
"ai_settings.mcp_server.argument_hints.category.endpoint": "Endpunkt",
"ai_settings.mcp_server.argument_hints.category.generic": "Fachlich",
"ai_settings.mcp_server.argument_hints.category.mode": "Modus",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "{{envVarCount}} Variable(n) erkannt; {{secretLikeCount}} wirken wie Geheimnisse. Hier werden nur Zweck und Risiko des key erklärt; value wird nicht angezeigt.",
"ai_settings.mcp_server.env_hints.title": "Hinweise zur Nutzung von Umgebungsvariablen",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "Ausfüllen: ",
- "ai_settings.mcp_server.env_hints.warning_prefix": "Achtung: {{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "Bei command=docker werden diese Umgebungsvariablen nur an die docker CLI übergeben und gelangen nicht automatisch in den Container.",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} Umgebungsvariablenwerte sind leer und müssen vor dem Testen ausgefüllt oder entfernt werden.",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} Umgebungsvariablen wirken noch wie Beispiel-Platzhalter.",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "Achtung: {{warnings}}",
"ai_settings.mcp_server.form.action.delete": "Löschen",
"ai_settings.mcp_server.form.action.delete_cancel": "Abbrechen",
"ai_settings.mcp_server.form.action.delete_confirm": "Diesen MCP-Dienst löschen?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "Deaktiviert",
"ai_settings.mcp_server.form.enabled.option.enabled": "Aktiviert",
"ai_settings.mcp_server.form.enabled.title": "Aktiviert",
- "ai_settings.mcp_server.form.env_status.empty": "Jede Zeile muss KEY=VALUE sein; Zeilen ohne Gleichheitszeichen oder mit Leerzeichen im key werden nicht gespeichert.",
- "ai_settings.mcp_server.form.env_status.invalid": "{{validCount}} Umgebungsvariable(n) erkannt; zusätzlich werden {{invalidCount}} ungültige Zeile(n) diesmal nicht gespeichert: {{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "{{count}} Umgebungsvariable(n) erkannt.",
"ai_settings.mcp_server.form.env.description": "Eine KEY=VALUE-Zeile pro Variable, meist für API Key, Arbeitsverzeichnis, Dienstadresse und ähnliche Konfiguration. Leer lassen, wenn nicht benötigt. Diese Werte werden lokal gespeichert und beim Start des MCP-Prozesses als Umgebungsvariablen übergeben; schreibe kein export und lege keine Geheimnisse in Chatinhalte.",
"ai_settings.mcp_server.form.env.placeholder": "Umgebungsvariablen, eine KEY=VALUE-Zeile pro Variable, z. B.:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "Umgebungsvariablen",
+ "ai_settings.mcp_server.form.env_status.empty": "Jede Zeile muss KEY=VALUE sein; Zeilen ohne Gleichheitszeichen oder mit Leerzeichen im key werden nicht gespeichert.",
+ "ai_settings.mcp_server.form.env_status.invalid": "{{validCount}} Umgebungsvariable(n) erkannt; zusätzlich werden {{invalidCount}} ungültige Zeile(n) diesmal nicht gespeichert: {{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "{{count}} Umgebungsvariable(n) erkannt.",
"ai_settings.mcp_server.form.instructions.save_description": "schreibt dieses MCP dauerhaft in die lokale Konfiguration.",
"ai_settings.mcp_server.form.instructions.save_title": "Speichern",
"ai_settings.mcp_server.form.instructions.test_description": "startet einmal mit den aktuellen Feldern, prüft die erkennbaren Tools und speichert die Konfiguration nicht.",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "Transport",
"ai_settings.mcp_server.guide.examples.description": "Trage bei Startbefehl nur das ausführbare Programm selbst ein. Vermische keine Argumente. Häufige Formen:",
"ai_settings.mcp_server.guide.examples.title": "Ausfüllbeispiele",
- "ai_settings.mcp_server.guide.field_lookup.description": "Wenn unklar ist, was in ein Parameterfeld gehört, beginne hier. Jedes Feld unten enthält konkrete Beispiele und Hinweise.",
- "ai_settings.mcp_server.guide.field_lookup.title": "Feld-Schnellreferenz",
"ai_settings.mcp_server.guide.field.args.avoid": "Trage npx/node/uvx/python/docker hier nicht erneut ein und füge nicht mehrere Argumente als eine lange Zeichenkette ein.",
"ai_settings.mcp_server.guide.field.args.detail": "npx -y pkg --stdio wird in -y, pkg und --stdio aufgeteilt. docker run --rm -i image wird in run, --rm, -i und image aufgeteilt.",
"ai_settings.mcp_server.guide.field.args.fill": "Trage -y, Paketname, Skriptname, -m, --stdio, run, --rm, -i, Image-Name und ähnliche Argumente einzeln ein.",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "stdio beibehalten.",
"ai_settings.mcp_server.guide.field.transport.summary": "Wie GoNavi mit diesem MCP Server kommuniziert.",
"ai_settings.mcp_server.guide.field.transport.title": "Transport",
+ "ai_settings.mcp_server.guide.field_lookup.description": "Wenn unklar ist, was in ein Parameterfeld gehört, beginne hier. Jedes Feld unten enthält konkrete Beispiele und Hinweise.",
+ "ai_settings.mcp_server.guide.field_lookup.title": "Feld-Schnellreferenz",
"ai_settings.mcp_server.guide.full_command.apply": "Automatisch in die Felder unten aufteilen",
"ai_settings.mcp_server.guide.full_command.description": "Füge den vollständigen Befehl direkt ein. GoNavi teilt ihn in Startbefehl / Befehlsargumente / Umgebungsvariablen auf. Unterstützt werden Unix KEY=VALUE, Windows PowerShell $env:KEY=VALUE; und cmd set KEY=VALUE && Präfixe.",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "Wird zerlegt als: Befehl {{command}}, {{argsCount}} Argument(e), {{envCount}} Umgebungsvariable(n).",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "Beispiel: ",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "Ausfüllen: ",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "Empfohlener Zugriff:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Aktuelle Grenze:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "Der lokale Einstieg von GoNavi MCP ist stdio und eignet sich für Clients wie Claude Code / Codex, die auf demselben Rechner wie GoNavi laufen.",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "Wenn OpenClaw/Hermans auf Cloud-Linux läuft, kann es den lokalen Windows-stdio-Befehl nicht direkt verwenden; starte GoNavi Streamable HTTP auf Windows und lasse den Cloud-Agent über Tunnel oder Reverse Proxy zugreifen.",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Aktuelle Grenze:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "Konfiguration ohne GUI / per CLI erzeugen:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "Kopierbarer Konfigurationsausschnitt (für Agents mit mcpServers JSON):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "Aktueller Hinweis: {{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "Oder setze die Umgebungsvariable GONAVI_MCP_HTTP_TOKEN= und führe dann {{standaloneCommand}} aus",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "Wenn Remote-SQL-Ausführung ausdrücklich benötigt wird, entferne --schema-only; execute_sql bleibt unter GoNavi AI-Sicherheitskontrollen, und Schreibvorgänge müssen allowMutating=true ausdrücklich übergeben.",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Ziel:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "Datenbankverbindungen, Konten und Passwörter bleiben in Windows GoNavi. Der Cloud-Agent muss keine Datenbankpasswörter speichern.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "Remotezugriff nutzt standardmäßig schema-only und registriert execute_sql nicht; geeignet, um OpenClaw/Hermans nur Strukturzugriff zu geben.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "Der Cloud-Agent liest nur Ergebnisse wie get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl über MCP tools.",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Ziel:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "CLI- / Dienst-Startbefehl:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. Füge in {{displayName}} einen Remote MCP Server hinzu, wähle Streamable HTTP als transport, setze die URL auf die getunnelte bzw. per Reverse Proxy erreichbare /mcp-Adresse und setze Authorization: Bearer .",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. Rufe zuerst get_connections auf, um connectionId zu erhalten, und danach Schema-Tools; schreibe database host/user/password nicht in die Cloud-Agent-Konfiguration.",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "Zusatzprompt für Datenbanksitzungen",
"ai_settings.prompts.field.global.description": "Gilt für alle AI-Sitzungen, zum Beispiel \"zuerst das Fazit nennen\" oder \"Antworten knapp halten\".",
"ai_settings.prompts.field.global.title": "Globaler Zusatzprompt",
- "ai_settings.prompts.field.jvm_diagnostic.description": "Gilt nur für den JVM-Diagnosearbeitsbereich, zum Beispiel \"erst den Plan, dann die Befehle nennen\".",
- "ai_settings.prompts.field.jvm_diagnostic.title": "Zusatzprompt für JVM-Diagnose",
"ai_settings.prompts.field.jvm.description": "Gilt nur für JVM-Ressourcen-Browsing und Analyse.",
"ai_settings.prompts.field.jvm.title": "Zusatzprompt für JVM-Ressourcenanalyse",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "Gilt nur für den JVM-Diagnosearbeitsbereich, zum Beispiel \"erst den Plan, dann die Befehle nennen\".",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "Zusatzprompt für JVM-Diagnose",
"ai_settings.prompts.message.save_failed": "Benutzerdefinierte Prompts konnten nicht gespeichert werden",
"ai_settings.prompts.message.saved": "Benutzerdefinierte Prompts gespeichert",
"ai_settings.prompts.placeholder.empty": "Leer lassen, um nichts Zusätzliches anzuhängen",
"ai_settings.prompts.user.description": "Dieser Inhalt wird nach den eingebauten Systemprompts als system message angehängt. Nutzen Sie ihn für persönlichen Antwortstil, Ausgabevorgaben oder Teamregeln. Bei Sicherheitsgrenzen haben Systemregeln weiterhin Vorrang.",
"ai_settings.prompts.user.title": "Benutzerdefinierte Prompts auf Benutzerebene",
+ "ai_settings.provider.action.add": "Modellanbieter hinzufügen",
+ "ai_settings.provider.action.delete": "Löschen",
+ "ai_settings.provider.action.edit": "Bearbeiten",
+ "ai_settings.provider.auto_model": "Automatisch ausgewählt",
+ "ai_settings.provider.confirm_delete": "Diesen Anbieter löschen?",
+ "ai_settings.provider.editor.add_title": "Modellanbieter hinzufügen",
+ "ai_settings.provider.editor.edit_title": "Modellanbieter bearbeiten",
+ "ai_settings.provider.empty.description": "Fügen Sie einen Anbieter hinzu, um den AI-Assistenten zu verwenden",
+ "ai_settings.provider.empty.title": "Noch kein Modellanbieter konfiguriert",
+ "ai_settings.provider.next_provider": "nächster Anbieter",
+ "ai_settings.provider.no_model": "Kein Modell ausgewählt",
"ai_settings.provider_preset.anthropic.desc": "Claude Opus/Sonnet Modelle",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "Benutzerdefinierter API-Endpunkt",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "Volcengine Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "GLM-5 / GLM-5-Turbo Modelle",
"ai_settings.provider_preset.zhipu.label": "Zhipu GLM",
- "ai_settings.provider.action.add": "Modellanbieter hinzufügen",
- "ai_settings.provider.action.delete": "Löschen",
- "ai_settings.provider.action.edit": "Bearbeiten",
- "ai_settings.provider.auto_model": "Automatisch ausgewählt",
- "ai_settings.provider.confirm_delete": "Diesen Anbieter löschen?",
- "ai_settings.provider.editor.add_title": "Modellanbieter hinzufügen",
- "ai_settings.provider.editor.edit_title": "Modellanbieter bearbeiten",
- "ai_settings.provider.empty.description": "Fügen Sie einen Anbieter hinzu, um den AI-Assistenten zu verwenden",
- "ai_settings.provider.empty.title": "Noch kein Modellanbieter konfiguriert",
- "ai_settings.provider.next_provider": "nächster Anbieter",
- "ai_settings.provider.no_model": "Kein Modell ausgewählt",
"ai_settings.safety.description": "Steuert, welche SQL-Operationstypen AI ausführen darf, um Daten zu schützen",
"ai_settings.safety.full.desc": "AI darf alle Operationen ausführen, einschließlich DDL. Bei Hochrisiko-Operationen werden Warnungen automatisch angezeigt.",
"ai_settings.safety.full.label": "Vollmodus",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "Datenbank",
"ai_settings.skill.scope.global.desc": "Für alle AI-Sitzungen aktiviert",
"ai_settings.skill.scope.global.label": "Global",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "Nur für die JVM-Diagnose-Workbench aktiviert",
- "ai_settings.skill.scope.jvm_diagnostic.label": "JVM-Diagnose",
"ai_settings.skill.scope.jvm.desc": "Nur für JVM-Ressourcenanalysen aktiviert",
"ai_settings.skill.scope.jvm.label": "JVM-Ressourcen",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "Nur für die JVM-Diagnose-Workbench aktiviert",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "JVM-Diagnose",
"ai_settings.skill.scopes_placeholder": "Auswählen, wo dieser Skill gelten soll",
"ai_settings.skill.status.disabled": "Deaktiviert",
"ai_settings.skill.status.enabled": "Aktiviert",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "Optional",
"ai_settings.tools.parameters.required": "Pflichtfeld",
"ai_settings.tools.parameters.type_label": "Typ: {{type}}",
- "ai_settings.tools.params_label": "Parameter:",
"ai_settings.tools.params.none": "Keine Parameter",
+ "ai_settings.tools.params_label": "Parameter:",
"ai_settings.tools.search.aria_label": "Integrierte Tools suchen",
"ai_settings.tools.search.clear": "Löschen",
"ai_settings.tools.search.placeholder": "Tools, Abläufe oder Parameter suchen, z. B. mcp / lineLimit / allowMutating / transaction",
"ai_settings.tools.summary": "{{flowVisible}}/{{flowTotal}} empfohlene Abläufe und {{toolVisible}}/{{toolTotal}} integrierte Tools werden angezeigt.",
"ai_settings.tools.workflow": "💡 Ablauf: get_connections → get_databases → get_tables → get_columns → SQL erzeugen",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "Claude Code-Konfigurationsverzeichnis konnte nicht erstellt werden: {{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Das Format der Claude Code-Konfiguration ist ungültig: {{path}} muss {{expected}} sein",
- "ai.service.mcp_client.claude_code.config_parse_failed": "Claude Code-Konfiguration konnte nicht geparst werden: {{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "Claude Code-Konfiguration konnte nicht gefunden werden: {{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "Claude Code-Konfiguration konnte nicht gelesen werden: {{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "Claude Code-Konfiguration konnte nicht serialisiert werden: {{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "Claude Code-Konfiguration konnte nicht geschrieben werden: {{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "Die MCP-Konfiguration auf Benutzerebene für Claude Code wurde geschrieben. Starten Sie Claude CLI neu; GoNavi erscheint dann unter User MCPs in /mcp.",
- "ai.service.mcp_client.claude_code.status.connected": "Die GoNavi MCP-Konfiguration auf Benutzerebene für Claude Code wurde erkannt und passt zum aktuellen GoNavi-Installationspfad",
- "ai.service.mcp_client.claude_code.status.missing": "Keine GoNavi MCP-Konfiguration auf Benutzerebene für Claude Code erkannt",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "In Claude Code wurde ein GoNavi MCP-Eintrag erkannt, aber die Prüfung des aktuellen GoNavi-Installationspfads ist fehlgeschlagen: {{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "In Claude Code wurde ein GoNavi MCP-Eintrag erkannt, der nicht zum aktuellen GoNavi-Installationspfad passt. Eine Aktualisierung wird empfohlen.",
- "ai.service.mcp_client.codex.config_dir_create_failed": "Codex-Konfigurationsverzeichnis konnte nicht erstellt werden: {{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Das Format der Codex-Konfiguration ist ungültig: {{path}} konnte nicht als {{expected}} gelesen werden",
- "ai.service.mcp_client.codex.config_path_failed": "Codex-Konfiguration konnte nicht gefunden werden: {{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "Codex-Konfiguration konnte nicht gelesen werden: {{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "Codex-Konfiguration konnte nicht geschrieben werden: {{detail}}",
- "ai.service.mcp_client.codex.install_success": "Die MCP-Konfiguration auf Benutzerebene für Codex wurde geschrieben. Starten Sie Codex CLI oder die Desktop-App neu, um GoNavi zu sehen.",
- "ai.service.mcp_client.codex.status.connected": "Die GoNavi MCP-Konfiguration auf Benutzerebene für Codex wurde erkannt und passt zum aktuellen GoNavi-Installationspfad",
- "ai.service.mcp_client.codex.status.missing": "Keine GoNavi MCP-Konfiguration auf Benutzerebene für Codex erkannt",
- "ai.service.mcp_client.codex.status.path_check_failed": "In Codex wurde ein GoNavi MCP-Eintrag erkannt, aber die Prüfung des aktuellen GoNavi-Installationspfads ist fehlgeschlagen: {{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "In Codex wurde ein GoNavi MCP-Eintrag erkannt, der nicht zum aktuellen GoNavi-Installationspfad passt. Eine Aktualisierung wird empfohlen.",
- "ai.service.mcp_client.executable_path_empty": "Der Pfad zur aktuellen GoNavi-Programmdatei ist leer",
- "ai.service.mcp_client.executable_path_failed": "Die aktuelle GoNavi-Programmdatei konnte nicht gefunden werden: {{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} läuft normalerweise in der Cloud oder in einer Remote-Umgebung. Binden Sie es über eine Remote-MCP-Brücke an Windows GoNavi an; Datenbankpasswörter bleiben auf diesem GoNavi-Rechner.",
- "ai.service.mcp_client.user_home_dir_unavailable": "Das aktuelle Benutzer-Home-Verzeichnis konnte nicht ermittelt werden",
"app.about.action.check_updates": "Nach Updates suchen",
"app.about.action.download_progress": "Downloadfortschritt",
"app.about.action.download_update": "Update herunterladen",
@@ -2433,8 +2433,8 @@
"app.about.hero.update_available_version": "Neue Version {{version}} gefunden",
"app.about.last_checked_at": "Zuletzt geprüft: {{time}}",
"app.about.last_checked_never": "Noch keine Updateprüfung",
- "app.about.message.check_failed_with_error": "Updateprüfung fehlgeschlagen: {{error}}",
"app.about.message.channel_switch_failed_with_error": "Wechsel des Update-Kanals fehlgeschlagen: {{error}}",
+ "app.about.message.check_failed_with_error": "Updateprüfung fehlgeschlagen: {{error}}",
"app.about.message.download_completed": "Update-Download abgeschlossen",
"app.about.message.download_completed_with_path": "Update-Download abgeschlossen. Paketpfad: {{path}}",
"app.about.message.download_failed_with_error": "Update-Download fehlgeschlagen: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "Browser-Mock ist nicht mit einem echten MCP-Dienst verbunden",
"app.browser_mock.provider.test_failed_detail": "Verbindungstest fehlgeschlagen: {{detail}}",
"app.browser_mock.provider.test_success": "Endpunkt-Verbindungstest erfolgreich",
+ "app.connection.message.editable_load_failed": "Die Details der gespeicherten Verbindung konnten nicht geladen werden. Stattdessen wird die maskierte Konfiguration geöffnet.",
+ "app.connection.message.editable_load_failed_with_detail": "Die Details der gespeicherten Verbindung konnten nicht geladen werden: {{detail}}. Stattdessen wird die maskierte Konfiguration geöffnet.",
"app.connection_package.action.start_export": "Export starten",
"app.connection_package.action.start_import": "Import starten",
"app.connection_package.dialog.export_title": "Verbindungen exportieren",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "{{count}} Verbindungen importiert. Einige Verbindungen enthalten keine Passwörter. Bearbeiten Sie diese Verbindungen und geben Sie vor dem Speichern die Passwörter ein.",
"app.connection_package.message.no_connections_to_export": "Keine Verbindungen zum Exportieren",
"app.connection_package.message.unsupported_file_format": "Dateiformatfehler: Unterstützt werden nur GoNavi-Wiederherstellungspakete, historische JSON-Verbindungsarrays, MySQL Workbench XML oder Navicat NCX",
- "app.connection.message.editable_load_failed": "Die Details der gespeicherten Verbindung konnten nicht geladen werden. Stattdessen wird die maskierte Konfiguration geöffnet.",
- "app.connection.message.editable_load_failed_with_detail": "Die Details der gespeicherten Verbindung konnten nicht geladen werden: {{detail}}. Stattdessen wird die maskierte Konfiguration geöffnet.",
"app.data_root.action.migrate_and_switch": "Vorhandene Daten migrieren und wechseln",
"app.data_root.action.open_current": "Aktuelles Verzeichnis öffnen",
"app.data_root.action.restore_default_directory": "Standardverzeichnis wiederherstellen",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "AI-Einstellungen",
"app.settings.entry.proxy.description": "Updateprüfungen, Treiberverwaltung und gemeinsamen Netzwerkzugang konfigurieren.",
"app.settings.entry.proxy.title": "Globaler Proxy",
- "app.settings.entry.web_auth.description": "Status der Browserzugriffs-Authentifizierung anzeigen und das Administratorpasswort ändern.",
- "app.settings.entry.web_auth.title": "Browserzugriffs-Authentifizierung",
"app.settings.entry.theme.description": "Helles oder dunkles Theme wechseln und die Oberfläche anpassen.",
"app.settings.entry.theme.title": "Theme und Darstellung",
+ "app.settings.entry.web_auth.description": "Status der Browserzugriffs-Authentifizierung anzeigen und das Administratorpasswort ändern.",
+ "app.settings.entry.web_auth.title": "Browserzugriffs-Authentifizierung",
"app.settings.group.about.description": "Versionsdetails, Repository-Links und weitere Produktinformationen.",
"app.settings.group.about.title": "Info",
"app.settings.group.preferences.description": "Sprache, Erscheinungsbild und Sidebar-Anzeige zentral verwalten.",
"app.settings.group.preferences.title": "Einstellungen",
"app.settings.group.services.description": "Netzwerkzugang und KI-bezogene Dienste konfigurieren.",
"app.settings.group.services.title": "Dienste",
+ "app.settings.sidebar_metadata.description": "Festlegen, welche Tabellenmetadaten neben Tabellennamen in der linken Sidebar angezeigt werden.",
+ "app.settings.sidebar_metadata.title": "Sidebar-Tabellenmetadaten",
+ "app.settings.title": "Einstellungscenter",
"app.settings.web_auth.description": "Hier sehen Sie den aktuellen Status der Browserzugriffs-Authentifizierung, die Sitzungsrichtlinie und den 2FA-Status. Nach der Anmeldung können Sie auch das Administratorpasswort ändern.",
"app.settings.web_auth.load_failed": "Browserzugriffs-Authentifizierungseinstellungen konnten nicht geladen werden",
"app.settings.web_auth.password.code_label": "Aktueller Code / Wiederherstellungscode",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} Stunden",
"app.settings.web_auth.value.minutes": "{{count}} Minuten",
"app.settings.web_auth.value.recovery_codes": "{{count}} verbleibend",
- "app.settings.sidebar_metadata.description": "Festlegen, welche Tabellenmetadaten neben Tabellennamen in der linken Sidebar angezeigt werden.",
- "app.settings.sidebar_metadata.title": "Sidebar-Tabellenmetadaten",
- "app.settings.title": "Einstellungscenter",
"app.shortcuts.action.diagnoseQuery.description": "EXPLAIN für die aktuelle SQL ausführen und Ausführungsplan mit Indexvorschlägen anzeigen",
"app.shortcuts.action.diagnoseQuery.label": "SQL-Diagnose",
+ "app.shortcuts.action.duplicateCurrentLine.description": "Die Zeile an der Cursorposition im Abfrageeditor duplizieren und darunter einfügen",
+ "app.shortcuts.action.duplicateCurrentLine.label": "Aktuelle Zeile darunter duplizieren",
"app.shortcuts.action.focusSidebarSearch.description": "Fokussiert das Suchfeld der linken Verbindungsstruktur",
"app.shortcuts.action.focusSidebarSearch.label": "Sidebar-Suche fokussieren",
+ "app.shortcuts.action.formatSql.description": "SQL im aktuellen Abfrageeditor formatieren",
+ "app.shortcuts.action.formatSql.label": "SQL formatieren",
"app.shortcuts.action.newConnection.description": "Neue Datenbank-, Runtime- oder andere Datenquellenverbindung erstellen",
"app.shortcuts.action.newConnection.label": "Neue Datenquelle",
"app.shortcuts.action.newQueryTab.description": "Erstellt einen neuen SQL-Abfrage-Tab",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "SQL ausführen",
"app.shortcuts.action.saveQuery.description": "Aktuellen Abfrage-Tab speichern; unbenannte Abfragen öffnen den Speicherdialog",
"app.shortcuts.action.saveQuery.label": "Abfrage speichern",
- "app.shortcuts.action.duplicateCurrentLine.description": "Die Zeile an der Cursorposition im Abfrageeditor duplizieren und darunter einfügen",
- "app.shortcuts.action.duplicateCurrentLine.label": "Aktuelle Zeile darunter duplizieren",
- "app.shortcuts.action.formatSql.description": "SQL im aktuellen Abfrageeditor formatieren",
- "app.shortcuts.action.formatSql.label": "SQL formatieren",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "AI-Inline-Vervollständigung im aktuellen SQL-Editor manuell anfordern",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "SQL-AI-Vervollständigung auslösen",
"app.shortcuts.action.selectCurrentStatement.description": "Zeile an der Cursorposition im Abfrageeditor auswählen und in die Zwischenablage kopieren",
"app.shortcuts.action.selectCurrentStatement.label": "Aktuelle Zeile auswählen und kopieren",
"app.shortcuts.action.sendAIChatMessage.description": "Aktuelle Nachricht im AI-Eingabefeld senden; Shift+Enter fügt immer einen Zeilenumbruch ein",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "Ergebnisbereich umschalten",
"app.shortcuts.action.toggleTheme.description": "Zwischen hellem und dunklem Theme wechseln",
"app.shortcuts.action.toggleTheme.label": "Theme umschalten",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "AI-Inline-Vervollständigung im aktuellen SQL-Editor manuell anfordern",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "SQL-AI-Vervollständigung auslösen",
"app.shortcuts.capture_hint": "Drücken Sie das Tastenkürzel, nachdem Sie auf \"Aufzeichnen\" geklickt haben. Mit Esc brechen Sie die Aufzeichnung ab. Globale Tastenkürzel sollten eine Modifikatortaste enthalten; AI-Chat-Senden unterstützt nur Enter-Kombinationen, Shift+Enter bleibt ein Zeilenumbruch.",
"app.shortcuts.capture_waiting": "Tastenkürzel drücken...",
"app.shortcuts.context.datagrid": "Datentabelle",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "Lokale Konfiguration wird geladen...",
"app.startup_readiness.loading_security_config": "Sicherheitskonfiguration wird geladen...",
"app.theme.action.restore_defaults": "Standardwerte wiederherstellen",
- "app.theme.appearance_settings_description": "Skalierung, Schriftgröße, Transparenz und Weichzeichnung zentral anpassen.",
- "app.theme.appearance_settings_title": "Darstellungseinstellungen",
"app.theme.appearance.blur_hint": "* Steuert nur die Unschärfe von Overlay-Ebenen innerhalb der App",
"app.theme.appearance.blur_title": "Gaußsche Weichzeichnung (Blur)",
"app.theme.appearance.enable_transparency_blur": "Transparenz und Weichzeichnung aktivieren",
"app.theme.appearance.enable_transparency_blur_hint": "Bei Deaktivierung bleiben die aktuellen Schwellenwerte erhalten und werden beim erneuten Aktivieren direkt wiederhergestellt.",
"app.theme.appearance.font_size_title": "Basisschriftgröße (Font Size)",
"app.theme.appearance.opacity_title": "Hintergrunddeckkraft (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "Wirkt sich nur auf die linke V2-Navigationsleiste aus und vergrößert dort Buttons und Verbindungsicons für große Displays.",
+ "app.theme.appearance.sidebar_rail_scale_title": "Größe der linken Navigationsbuttons",
"app.theme.appearance.transparency_blur_title": "Transparenz- und Weichzeichnungseffekte",
"app.theme.appearance.ui_scale_hint": "* Für kleine Bildschirme werden 85%-95% empfohlen",
"app.theme.appearance.ui_scale_title": "UI-Skalierung (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "Wirkt sich nur auf die linke V2-Navigationsleiste aus und vergrößert dort Buttons und Verbindungsicons für große Displays.",
- "app.theme.appearance.sidebar_rail_scale_title": "Größe der linken Navigationsbuttons",
"app.theme.appearance.windows_acrylic_hint": "Windows verwendet den systemeigenen Acrylic-Effekt. Die Unschärfestärke wird vom System gesteuert.",
+ "app.theme.appearance_settings_description": "Skalierung, Schriftgröße, Transparenz und Weichzeichnung zentral anpassen.",
+ "app.theme.appearance_settings_title": "Darstellungseinstellungen",
"app.theme.data_table.column_width_hint": "Der Standardmodus nutzt 200px, der kompakte Modus 140px als Standardspaltenbreite. Manuell angepasste Spaltenbreiten bleiben vorrangig erhalten.",
"app.theme.data_table.column_width_mode": "Spaltenbreitenmodus der Datentabelle",
"app.theme.data_table.column_width_mode.compact": "Kompakt 140px",
"app.theme.data_table.column_width_mode.standard": "Standard 200px",
"app.theme.data_table.density": "Tabellendichte",
- "app.theme.data_table.density_hint": "Steuert Zeilenhöhe, Spaltenbreite und Innenabstand. Komfortabel eignet sich für große Bildschirme; kompakt maximiert die Informationsdichte. Manuell gezogene Spaltenbreiten bleiben vorrangig erhalten.",
"app.theme.data_table.density.comfortable": "Komfortabel",
"app.theme.data_table.density.compact": "Kompakt",
"app.theme.data_table.density.standard": "Standard",
+ "app.theme.data_table.density_hint": "Steuert Zeilenhöhe, Spaltenbreite und Innenabstand. Komfortabel eignet sich für große Bildschirme; kompakt maximiert die Informationsdichte. Manuell gezogene Spaltenbreiten bleiben vorrangig erhalten.",
"app.theme.data_table.follow_global": "Global folgen",
"app.theme.data_table.font_size": "Schriftgröße der Datentabelle",
"app.theme.data_table.sidebar_tree_font_size": "Schriftgröße des linken Schemasbaums",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "Monospace-Schriftfamilie",
"app.theme.font_family.title": "Schriftfamilie",
"app.theme.font_family.ui_title": "UI-Schriftfamilie",
- "app.theme.query_template.description": "Legt fest, welcher SQL-Inhalt beim Öffnen eines neuen Abfrage-Tabs vorbefüllt wird.",
- "app.theme.query_template.hint": "Leeren Sie den Text, damit neue Abfrage-Tabs leer starten. Mit Standard wiederherstellen kehren Sie zu SELECT * FROM zurück.",
- "app.theme.query_template.reset_default": "Standard wiederherstellen",
- "app.theme.query_template.title": "Standard-SQL für neue Abfragen",
"app.theme.mac_window.restart_hint": "* Benutzerdefinierte Schaltflächen oben rechts werden ausgeblendet. Falls der Systemfensterstil nicht sofort aktualisiert wird, starten Sie die App neu.",
"app.theme.mac_window.title": "macOS-Fenstersteuerung",
"app.theme.mac_window.use_native_controls": "Native macOS-Fenstersteuerung verwenden",
"app.theme.mac_window.use_native_controls_hint": "Zeigt die roten/gelben/grünen Schaltflächen oben links und priorisiert natives macOS-Vollbildverhalten.",
- "app.theme.mode_title": "Theme-Modus",
"app.theme.mode.dark.description": "Geeignet für dunkle Umgebungen mit ruhigerer visueller Wirkung.",
"app.theme.mode.dark.label": "Dunkles Theme",
"app.theme.mode.light.description": "Geeignet für helle Umgebungen mit leichterer visueller Hierarchie.",
"app.theme.mode.light.label": "Helles Theme",
"app.theme.mode.system.description": "Folgt dem Erscheinungsbild des Betriebssystems und wechselt automatisch.",
"app.theme.mode.system.label": "System folgen",
+ "app.theme.mode_title": "Theme-Modus",
"app.theme.nav.appearance.description": "Skalierung, Schrift und Transparenz",
"app.theme.nav.appearance.title": "Darstellungsparameter",
"app.theme.nav.theme.description": "Wechsel zwischen hell und dunkel",
"app.theme.nav.theme.title": "Theme-Modus",
"app.theme.navigation_title": "Einstellungsnavigation",
+ "app.theme.query_template.description": "Legt fest, welcher SQL-Inhalt beim Öffnen eines neuen Abfrage-Tabs vorbefüllt wird.",
+ "app.theme.query_template.hint": "Leeren Sie den Text, damit neue Abfrage-Tabs leer starten. Mit Standard wiederherstellen kehren Sie zu SELECT * FROM zurück.",
+ "app.theme.query_template.reset_default": "Standard wiederherstellen",
+ "app.theme.query_template.title": "Standard-SQL für neue Abfragen",
"app.theme.startup_window.fullscreen": "Beim Start im Vollbild öffnen",
"app.theme.startup_window.fullscreen_windows": "Beim Start im Vollbild öffnen (Windows behandelt dies als Maximieren)",
"app.theme.startup_window.hint": "* Wird beim nächsten Start wirksam",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "In den Hintergrund ausblenden",
"app.update.action.install_update": "Update installieren",
"app.update.action.open_install_directory": "Installationsverzeichnis öffnen",
+ "app.update.backend.error.channel_invalid": "Ungültiger Update-Kanal: {{channel}}",
"app.update.backend.error.check_failed": "Updateprüfung fehlgeschlagen: {{detail}}",
"app.update.backend.error.check_http_status": "Updateprüfung fehlgeschlagen: HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "Ungültiger Update-Kanal: {{channel}}",
"app.update.backend.error.download_failed": "Updatedownload fehlgeschlagen: {{detail}}",
+ "app.update.backend.error.install_target_not_writable": "Das aktuelle Installationsverzeichnis ist nicht beschreibbar: {{path}} ({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "Das aktuelle Installationsverzeichnis konnte nicht ermittelt werden",
"app.update.backend.error.install_unsupported": "Updateinstallation wird auf dieser Plattform nicht unterstützt: {{platform}}",
"app.update.backend.error.latest_version_unparseable": "Neueste Versionsnummer konnte nicht gelesen werden",
"app.update.backend.error.network_dns": "GitHub konnte nicht erreicht werden: {{host}} kann nicht aufgelöst werden. Prüfen Sie, ob der globale Proxy angewendet wurde, oder testen Sie ihn zuerst in den globalen Proxy-Einstellungen.",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS enthält kein Updatepaket für die aktuelle Plattform",
"app.update.backend.error.sha256sums_download_failed": "SHA256SUMS konnte nicht heruntergeladen werden: HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release stellt keine SHA256SUMS bereit",
- "app.update.backend.error.install_target_not_writable": "Das aktuelle Installationsverzeichnis ist nicht beschreibbar: {{path}} ({{detail}})",
- "app.update.backend.error.install_target_unresolved": "Das aktuelle Installationsverzeichnis konnte nicht ermittelt werden",
"app.update.backend.error.update_package_not_found": "Updatepaket nicht gefunden: {{name}}",
"app.update.backend.message.app_directory_unavailable": "Auf das App-Verzeichnis kann nicht zugegriffen werden: {{path}}",
"app.update.backend.message.app_directory_unresolved_download": "Das aktuelle App-Verzeichnis kann nicht bestimmt werden, daher kann das Update nicht heruntergeladen werden",
@@ -3015,6 +3015,64 @@
"common.success": "Erfolg",
"common.unknown": "Unbekannt",
"common.warning": "Warnung",
+ "connection.backend.action.apply_result_changes": "Ergebnisänderungen übernehmen",
+ "connection.backend.action.clear_table": "Tabellendaten leeren",
+ "connection.backend.action.create_database": "Datenbank erstellen",
+ "connection.backend.action.create_schema": "Schema erstellen",
+ "connection.backend.action.data_sync_structure": "Struktur des Synchronisationsziels ändern",
+ "connection.backend.action.data_sync_write": "Synchronisierte Daten schreiben",
+ "connection.backend.action.drop_database": "Datenbank löschen",
+ "connection.backend.action.drop_function_or_procedure": "Funktion oder Stored Procedure löschen",
+ "connection.backend.action.drop_schema": "Schema löschen",
+ "connection.backend.action.drop_table": "Tabelle löschen",
+ "connection.backend.action.drop_view": "View löschen",
+ "connection.backend.action.import_data": "Daten importieren",
+ "connection.backend.action.preview_result_changes": "Ergebnisänderungen in der Vorschau anzeigen",
+ "connection.backend.action.rename_database": "Datenbank umbenennen",
+ "connection.backend.action.rename_schema": "Schema umbenennen",
+ "connection.backend.action.rename_table": "Tabelle umbenennen",
+ "connection.backend.action.rename_view": "View umbenennen",
+ "connection.backend.action.truncate_table": "Tabelle per TRUNCATE leeren",
+ "connection.backend.error.readonly_action_blocked": "Für diese Verbindung ist der Produktionsschutz aktiv; {{action}} ist nicht erlaubt.",
+ "connection.copy_suffix": " - Kopie",
+ "connection.delete": "Verbindung löschen",
+ "connection.edit": "Verbindung bearbeiten",
+ "connection.new": "Neue Verbindung",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase unterstützt nur MySQL/Oracle-Mandantenprotokolle; \"{{value}}\" wird nicht unterstützt. Wechseln Sie zu MySQL oder Oracle.",
+ "connection.sidebar.delete.backendUnavailable": "Löschen der Verbindung fehlgeschlagen: Backend-Schnittstelle nicht verfügbar",
+ "connection.sidebar.delete.confirmContent": "Verbindung \"{{name}}\" wirklich löschen?",
+ "connection.sidebar.delete.confirmTitle": "Löschen bestätigen",
+ "connection.sidebar.delete.failureFallback": "Löschen der Verbindung fehlgeschlagen",
+ "connection.sidebar.delete.success": "Verbindung gelöscht",
+ "connection.sidebar.disconnect.success": "Verbindung getrennt",
+ "connection.sidebar.duplicate.backendUnavailable": "Kopieren der Verbindung fehlgeschlagen: Backend-Schnittstelle nicht verfügbar",
+ "connection.sidebar.duplicate.failureFallback": "Kopieren der Verbindung fehlgeschlagen",
+ "connection.sidebar.duplicate.noResult": "Kopieren der Verbindung fehlgeschlagen: Backend hat kein Ergebnis zurückgegeben",
+ "connection.sidebar.duplicate.success": "Verbindung kopiert: {{name}}",
+ "connection.sidebar.group.badge": "Gruppe",
+ "connection.sidebar.group.collapseAria": "Verbindungsgruppe {{name}} einklappen",
+ "connection.sidebar.group.delete": "Gruppe löschen",
+ "connection.sidebar.group.deleteConfirmContent": "Gruppe \"{{name}}\" löschen? Die enthaltenen Verbindungen bleiben erhalten.",
+ "connection.sidebar.group.deleteConfirmTitle": "Löschen bestätigen",
+ "connection.sidebar.group.edit": "Gruppe bearbeiten",
+ "connection.sidebar.group.expandAria": "Verbindungsgruppe {{name}} erweitern",
+ "connection.sidebar.group.meta": "{{count}} Verbindungen · Verbindungsgruppe",
+ "connection.sidebar.group.untitled": "Unbenannte Gruppe",
+ "connection.sidebar.menu.copy": "Verbindung kopieren",
+ "connection.sidebar.menu.createDatabase": "Neue Datenbank",
+ "connection.sidebar.menu.current": "Aktuell",
+ "connection.sidebar.menu.delete": "Verbindung löschen",
+ "connection.sidebar.menu.disconnect": "Verbindung trennen",
+ "connection.sidebar.menu.groupSection": "Verbindungsgruppen",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "Adresse nicht konfiguriert",
+ "connection.sidebar.menu.moveOutTag": "Aus Tag entfernen",
+ "connection.sidebar.menu.moveToTag": "Zu Tag verschieben",
+ "connection.sidebar.menu.moveToUngrouped": "Aus Gruppe entfernen",
+ "connection.sidebar.menu.refresh": "Verbindung aktualisieren",
+ "connection.sidebar.menu.section": "Verbindung",
+ "connection.test": "Verbindung testen",
+ "connection.unnamed": "Unbenannte Verbindung",
"connection_modal.action.browse": "Durchsuchen...",
"connection_modal.action.cancel": "Abbrechen",
"connection_modal.action.close": "Schließen",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "Verbindungs-URI eingeben, erzeugen oder einlesen.",
"connection_modal.config_section.uri.title": "Verbindungs-URI",
"connection_modal.db_icon_label.custom": "Benutzerdefiniert",
+ "connection_modal.db_type.custom": "Benutzerdefiniert",
"connection_modal.db_type_hint.custom": "Mit einem benutzerdefinierten Treiber und DSN verbinden.",
"connection_modal.db_type_hint.file": "Eine lokale SQLite- oder DuckDB-Datenbankdatei auswählen.",
"connection_modal.db_type_hint.mongodb": "Mit MongoDB Standalone, Replica Set oder SRV-Adressen verbinden.",
"connection_modal.db_type_hint.redis": "Mit Redis Standalone oder Redis Cluster verbinden.",
"connection_modal.db_type_hint.standard": "Host, Port, Authentifizierung und optional eine Datenbank eingeben.",
- "connection_modal.db_type.custom": "Benutzerdefiniert",
"connection_modal.driver.current": "Aktuell",
"connection_modal.error.unknown": "Unbekannter Fehler",
"connection_modal.error.unknown_exception": "Unbekannter Fehler",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "Verbindungsname",
"connection_modal.field.connection_timeout_seconds": "Verbindungs-Timeout (Sekunden)",
"connection_modal.field.connection_timeout_seconds_ascii": "Verbindungs-Timeout (Sekunden)",
- "connection_modal.field.default_database_optional": "Standarddatenbank (optional)",
"connection_modal.field.defaultDatabase.placeholder": "Zum Beispiel: appdb",
+ "connection_modal.field.default_database_optional": "Standarddatenbank (optional)",
"connection_modal.field.display_databases_optional": "Anzuzeigende Datenbanken (optional)",
- "connection_modal.field.driver_name": "Treibername",
"connection_modal.field.driver.placeholder": "Zum Beispiel: mysql, postgres",
+ "connection_modal.field.driver_name": "Treibername",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "Beispiel: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "Dateipfad (absoluter Pfad)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Replica-Set-Benutzername (optional)",
"connection_modal.field.replica_username_optional": "Replica-Benutzername (optional)",
"connection_modal.field.save_password": "Passwort speichern",
- "connection_modal.field.service_name": "Servicename",
"connection_modal.field.serviceName.placeholder": "Zum Beispiel: ORCLPDB1",
+ "connection_modal.field.service_name": "Servicename",
"connection_modal.field.ssh_host": "SSH-Host",
"connection_modal.field.ssh_password": "SSH-Passwort",
"connection_modal.field.ssh_user": "SSH-Benutzer",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "Verbindung über einen GoNavi Agent, wenn direkter Netzwerkzugriff eingeschränkt ist.",
"connection_modal.jvm.agent_help": "Basis-URL des GoNavi Agent-Dienstes.",
"connection_modal.jvm.agent_url": "Agent-URL",
- "connection_modal.jvm.diagnostic_api_key_optional": "Diagnose-API-Schlüssel (optional)",
- "connection_modal.jvm.diagnostic_description": "Optionale Diagnosebefehle für die JVM-Fehlersuche aktivieren.",
- "connection_modal.jvm.diagnostic_disabled_hint": "Diagnoseerweiterung ist deaktiviert. Nur bei Bedarf zur Laufzeit-Fehlersuche aktivieren.",
- "connection_modal.jvm.diagnostic_timeout_seconds": "Diagnose-Timeout (Sekunden)",
- "connection_modal.jvm.diagnostic_title": "Diagnoseerweiterung",
- "connection_modal.jvm.diagnostic_transport": "Diagnosetransport",
"connection_modal.jvm.diagnostic.agent_bridge_description": "Den Diagnose-Endpoint der GoNavi Agent Bridge verwenden.",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "Arthas Tunnel verwenden, um die Ziel-JVM zu erreichen.",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Basis-URL des Arthas Tunnel-Servers.",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "Tracing- und Watch-Befehle erlauben, die Laufzeitaufwand verursachen.",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "Diagnose-API-Schlüssel (optional)",
+ "connection_modal.jvm.diagnostic_description": "Optionale Diagnosebefehle für die JVM-Fehlersuche aktivieren.",
+ "connection_modal.jvm.diagnostic_disabled_hint": "Diagnoseerweiterung ist deaktiviert. Nur bei Bedarf zur Laufzeit-Fehlersuche aktivieren.",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "Diagnose-Timeout (Sekunden)",
+ "connection_modal.jvm.diagnostic_title": "Diagnoseerweiterung",
+ "connection_modal.jvm.diagnostic_transport": "Diagnosetransport",
"connection_modal.jvm.endpoint_api_key_optional": "Endpoint-API-Schlüssel (optional)",
"connection_modal.jvm.endpoint_description": "Mit einem vom Dienst bereitgestellten Endpoint statt direkt mit JMX verbinden.",
"connection_modal.jvm.endpoint_help": "Basis-URL des JVM-Verwaltungs-Endpoint.",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "Konfiguriert einen NameServer für lokale oder einfache Umgebungen.",
"connection_modal.messageQueue.rocketmq.topology.single.label": "Einzelner NameServer",
"connection_modal.messageQueue.topology.cluster.label": "Clustermodus",
- "connection_modal.mongodb.auth_mechanism": "Authentifizierungsmechanismus",
"connection_modal.mongodb.auth.auto": "Automatisch",
"connection_modal.mongodb.auth.auto_description": "Der Treiber wählt den Authentifizierungsmechanismus.",
"connection_modal.mongodb.auth.aws_iam_description": "AWS IAM-Authentifizierung verwenden. AWS IAM-Zugangsdaten in der Laufzeitumgebung bereitstellen.",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "Ohne MongoDB-Authentifizierung verbinden.",
"connection_modal.mongodb.auth.scram_sha1_description": "SCRAM-SHA-1-Authentifizierung verwenden.",
"connection_modal.mongodb.auth.scram_sha256_description": "SCRAM-SHA-256-Authentifizierung verwenden.",
+ "connection_modal.mongodb.auth_mechanism": "Authentifizierungsmechanismus",
"connection_modal.mongodb.discovery.current": "Aktuell",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "Wenn SRV und SSH-Tunnel gleichzeitig aktiv sind, kann lokale DNS-Auflösung erforderlich sein.",
"connection_modal.mongodb.discovery.srv.description": "mongodb+srv verwenden und Zielknoten per DNS erkennen lassen.",
"connection_modal.mongodb.discovery.srv.label": "SRV-Adresse",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "Wenn SRV und SSH-Tunnel gleichzeitig aktiv sind, kann lokale DNS-Auflösung erforderlich sein.",
"connection_modal.mongodb.discovery.standard.description": "Direkt mit host:port verbinden oder eine Replikatset-Knotenliste verwenden.",
"connection_modal.mongodb.discovery.standard.label": "Standardadresse",
"connection_modal.mongodb.members.health": "Zustand",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "Ein",
"connection_modal.table.health": "Zustand",
"connection_modal.table.role": "Rolle",
+ "connection_modal.test.redis_database_list_failure": "Verbunden, aber die Redis-Datenbankliste konnte nicht geladen werden: {{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "Verbunden, aber das Laden der Redis-Datenbankliste ist abgelaufen (>{{seconds}} Sekunden)",
"connection_modal.test_error.description": "Vollständige vom Backend zurückgegebene Fehlermeldung anzeigen.",
"connection_modal.test_error.empty": "Keine Fehlerdetails",
"connection_modal.test_error.title": "Details zum fehlgeschlagenen Verbindungstest",
- "connection_modal.test.redis_database_list_failure": "Verbunden, aber die Redis-Datenbankliste konnte nicht geladen werden: {{detail}}",
- "connection_modal.test.redis_database_list_timeout": "Verbunden, aber das Laden der Redis-Datenbankliste ist abgelaufen (>{{seconds}} Sekunden)",
"connection_modal.title.create": "Neue {{type}}-Verbindung",
"connection_modal.title.create_description": "Verbindungskonfiguration eingeben und speichern.",
"connection_modal.title.edit": "Verbindung bearbeiten",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "HTTP Tunnel-Host eingeben",
"connection_modal.validation.tunnel_port_required": "HTTP Tunnel-Port eingeben",
"connection_modal.validation.username_required": "Benutzernamen eingeben",
- "connection.backend.action.apply_result_changes": "Ergebnisänderungen übernehmen",
- "connection.backend.action.clear_table": "Tabellendaten leeren",
- "connection.backend.action.create_database": "Datenbank erstellen",
- "connection.backend.action.create_schema": "Schema erstellen",
- "connection.backend.action.data_sync_structure": "Struktur des Synchronisationsziels ändern",
- "connection.backend.action.data_sync_write": "Synchronisierte Daten schreiben",
- "connection.backend.action.drop_database": "Datenbank löschen",
- "connection.backend.action.drop_function_or_procedure": "Funktion oder Stored Procedure löschen",
- "connection.backend.action.drop_schema": "Schema löschen",
- "connection.backend.action.drop_table": "Tabelle löschen",
- "connection.backend.action.drop_view": "View löschen",
- "connection.backend.action.import_data": "Daten importieren",
- "connection.backend.action.preview_result_changes": "Ergebnisänderungen in der Vorschau anzeigen",
- "connection.backend.action.rename_database": "Datenbank umbenennen",
- "connection.backend.action.rename_schema": "Schema umbenennen",
- "connection.backend.action.rename_table": "Tabelle umbenennen",
- "connection.backend.action.rename_view": "View umbenennen",
- "connection.backend.action.truncate_table": "Tabelle per TRUNCATE leeren",
- "connection.backend.error.readonly_action_blocked": "Für diese Verbindung ist der Produktionsschutz aktiv; {{action}} ist nicht erlaubt.",
- "connection.copy_suffix": " - Kopie",
- "connection.delete": "Verbindung löschen",
- "connection.edit": "Verbindung bearbeiten",
- "connection.new": "Neue Verbindung",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase unterstützt nur MySQL/Oracle-Mandantenprotokolle; \"{{value}}\" wird nicht unterstützt. Wechseln Sie zu MySQL oder Oracle.",
- "connection.sidebar.delete.backendUnavailable": "Löschen der Verbindung fehlgeschlagen: Backend-Schnittstelle nicht verfügbar",
- "connection.sidebar.delete.confirmContent": "Verbindung \"{{name}}\" wirklich löschen?",
- "connection.sidebar.delete.confirmTitle": "Löschen bestätigen",
- "connection.sidebar.delete.failureFallback": "Löschen der Verbindung fehlgeschlagen",
- "connection.sidebar.delete.success": "Verbindung gelöscht",
- "connection.sidebar.disconnect.success": "Verbindung getrennt",
- "connection.sidebar.duplicate.backendUnavailable": "Kopieren der Verbindung fehlgeschlagen: Backend-Schnittstelle nicht verfügbar",
- "connection.sidebar.duplicate.failureFallback": "Kopieren der Verbindung fehlgeschlagen",
- "connection.sidebar.duplicate.noResult": "Kopieren der Verbindung fehlgeschlagen: Backend hat kein Ergebnis zurückgegeben",
- "connection.sidebar.duplicate.success": "Verbindung kopiert: {{name}}",
- "connection.sidebar.group.badge": "Gruppe",
- "connection.sidebar.group.collapseAria": "Verbindungsgruppe {{name}} einklappen",
- "connection.sidebar.group.delete": "Gruppe löschen",
- "connection.sidebar.group.deleteConfirmContent": "Gruppe \"{{name}}\" löschen? Die enthaltenen Verbindungen bleiben erhalten.",
- "connection.sidebar.group.deleteConfirmTitle": "Löschen bestätigen",
- "connection.sidebar.group.edit": "Gruppe bearbeiten",
- "connection.sidebar.group.expandAria": "Verbindungsgruppe {{name}} erweitern",
- "connection.sidebar.group.meta": "{{count}} Verbindungen · Verbindungsgruppe",
- "connection.sidebar.group.untitled": "Unbenannte Gruppe",
- "connection.sidebar.menu.copy": "Verbindung kopieren",
- "connection.sidebar.menu.createDatabase": "Neue Datenbank",
- "connection.sidebar.menu.current": "Aktuell",
- "connection.sidebar.menu.delete": "Verbindung löschen",
- "connection.sidebar.menu.disconnect": "Verbindung trennen",
- "connection.sidebar.menu.groupSection": "Verbindungsgruppen",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "Adresse nicht konfiguriert",
- "connection.sidebar.menu.moveOutTag": "Aus Tag entfernen",
- "connection.sidebar.menu.moveToTag": "Zu Tag verschieben",
- "connection.sidebar.menu.moveToUngrouped": "Aus Gruppe entfernen",
- "connection.sidebar.menu.refresh": "Verbindung aktualisieren",
- "connection.sidebar.menu.section": "Verbindung",
- "connection.test": "Verbindung testen",
- "connection.unnamed": "Unbenannte Verbindung",
"data_export.action.clear": "Leeren",
"data_export.action.clear_progress": "Aktuellen Fortschritt leeren",
"data_export.action.select_all": "Alle auswählen",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "Jetzt",
"data_grid.cell_editor.title": "Zelle bearbeiten",
"data_grid.cell_editor.title_with_column": "Zelle bearbeiten: {{column}}",
+ "data_grid.column.comment_tooltip": "Kommentar: {{comment}}",
+ "data_grid.column.drag_tooltip": "Ziehen, um Spalten neu anzuordnen",
+ "data_grid.column.foreign_key_jump_title": "Zur Fremdschlüssel-Tabelle springen: {{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "Fremdschlüssel: {{target}}",
+ "data_grid.column.resize_tooltip": "Ziehen, um die Spaltenbreite zu ändern; Doppelklick für automatische Anpassung",
+ "data_grid.column.type_tooltip": "Typ: {{type}}",
"data_grid.column_quick_find.placeholder": "Zur Spalte springen...",
"data_grid.column_quick_find.tooltip": "Spaltennamen eingeben, dann Enter drücken oder die Suchschaltfläche nutzen, um zur Spalte zu springen",
"data_grid.column_settings.column_visibility": "Spaltensichtbarkeit",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "Alle anzeigen",
"data_grid.column_settings.show_comments": "Spaltenkommentare in der Kopfzeile anzeigen",
"data_grid.column_settings.show_types": "Spaltentypen in der Kopfzeile anzeigen",
- "data_grid.column.comment_tooltip": "Kommentar: {{comment}}",
- "data_grid.column.drag_tooltip": "Ziehen, um Spalten neu anzuordnen",
- "data_grid.column.foreign_key_jump_title": "Zur Fremdschlüssel-Tabelle springen: {{tableName}}",
- "data_grid.column.foreign_key_tooltip": "Fremdschlüssel: {{target}}",
- "data_grid.column.resize_tooltip": "Ziehen, um die Spaltenbreite zu ändern; Doppelklick für automatische Anpassung",
- "data_grid.column.type_tooltip": "Typ: {{type}}",
"data_grid.context_menu.auto_fit_column": "Spaltenbreite an Inhalt anpassen",
"data_grid.context_menu.clear_column_sort": "Sortierung für dieses Feld aufheben",
"data_grid.context_menu.column_display_section": "Feldanzeige",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "Es sind keine Zeilen ausgewählt. Wähle einen Exportbereich:",
"data_grid.export.options_title": "Exportoptionen",
"data_grid.export.query_result_title": "Abfrageergebnisse exportieren",
- "data_grid.export.scope_prompt": "Exportbereich auswählen:",
"data_grid.export.scope.all_results_cached": "Alle Ergebnisse (aktueller Cache {{count}} Zeilen)",
"data_grid.export.scope.all_results_cached_description": "Exportiert alle Ergebnisse aus dem aktuellen Cache, wenn die aktuelle Abfrage nicht erneut ausgeführt werden kann.",
"data_grid.export.scope.all_results_requery": "Alle Ergebnisse (erneut abfragen)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "Ausgewählte Zeilen",
"data_grid.export.scope.selected_rows_count": "Ausgewählte Zeilen ({{count}} Zeilen)",
"data_grid.export.scope.selected_rows_description": "Exportiert nur die markierten Zeilen aus der aktuellen Ergebnismenge.",
+ "data_grid.export.scope_prompt": "Exportbereich auswählen:",
"data_grid.export.selected_rows": "Ausgewählte Zeilen exportieren ({{count}} Zeilen)",
"data_grid.filter.add_condition": "Bedingung hinzufügen",
"data_grid.filter.add_sort": "Sortierung hinzufügen",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "Los",
"data_grid.pagination.jump_aria": "Zur Seite springen",
"data_grid.pagination.jump_label": "Springen",
- "data_grid.pagination.page_size_aria": "Zeilen pro Seite",
- "data_grid.pagination.page_size_option": "{{count}} Zeilen / Seite",
"data_grid.pagination.page.current": "Seite {{current}}",
"data_grid.pagination.page.known": "Seite {{current}} / {{totalPages}}",
+ "data_grid.pagination.page_size_aria": "Zeilen pro Seite",
+ "data_grid.pagination.page_size_option": "{{count}} Zeilen / Seite",
"data_grid.pagination.result_set": "Ergebnismenge",
"data_grid.pagination.summary.approximate": "Aktuell {{current}} Zeilen / etwa {{total}} Zeilen",
"data_grid.pagination.summary.cancelled": "Aktuell {{current}} Zeilen / Zählung abgebrochen",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "Quelle und Ziel konfigurieren",
"data_sync.step.result": "Ausführungsergebnis",
"data_sync.step.select_tables": "Tabellen auswählen",
- "data_sync.table_picker.help": "Zu synchronisierende Tabellen auswählen:",
- "data_sync.table_picker.item_unit": "Eintrag",
- "data_sync.table_picker.items_unit": "Einträge",
- "data_sync.table_picker.not_found": "Keine Daten",
- "data_sync.table_picker.search_placeholder": "Tabellen suchen...",
- "data_sync.table_picker.selected_title": "Ausgewählte Tabellen",
- "data_sync.table_picker.show_same": "Gleiche Tabellen anzeigen",
- "data_sync.table_picker.source_title": "Quelltabellen",
"data_sync.table.delete": "Löschen",
"data_sync.table.insert": "Einfügen",
"data_sync.table.plan": "Ablaufplan",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "Fehlt",
"data_sync.table.target_table": "Zieltabelle",
"data_sync.table.update": "Aktualisieren",
+ "data_sync.table_picker.help": "Zu synchronisierende Tabellen auswählen:",
+ "data_sync.table_picker.item_unit": "Eintrag",
+ "data_sync.table_picker.items_unit": "Einträge",
+ "data_sync.table_picker.not_found": "Keine Daten",
+ "data_sync.table_picker.search_placeholder": "Tabellen suchen...",
+ "data_sync.table_picker.selected_title": "Ausgewählte Tabellen",
+ "data_sync.table_picker.show_same": "Gleiche Tabellen anzeigen",
+ "data_sync.table_picker.source_title": "Quelltabellen",
"data_sync.title.compare_result": "Vergleichsergebnis",
"data_sync.title.execution_log": "Ausführungsprotokoll",
"data_sync.title.migration": "Datenquellenübergreifende Migration",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "Datenbankverbindung nicht gefunden",
"definition_viewer.error.event_name_empty": "Ereignisname ist leer",
"definition_viewer.error.load_failed": "Laden fehlgeschlagen",
+ "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.query_failed": "Definitionsabfrage fehlgeschlagen",
"definition_viewer.error.query_failed_detail": "Definitionsabfrage fehlgeschlagen: {{detail}}",
- "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.routine_name_empty": "Funktions-/Prozedurname ist leer",
"definition_viewer.error.sequence_name_empty": "Sequence name is empty",
"definition_viewer.error.view_name_empty": "Ansichtsname ist leer",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "Alt",
"dev.perf_data_grid.ui_version.v2": "Neue UI",
"dev.perf_data_grid.ui_version.v2_short": "Neu",
+ "driver.guidance.customConnectionDriverHelp": "Unterstützt: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; Aliasse: postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Geben Sie einen bereits von GoNavi registrierten Go database/sql-Treibernamen ein. Geben Sie keinen System-ODBC/JDBC-Treibernamen direkt ein und importieren Sie kein JDBC Jar.",
"driver_manager.action.close": "Schließen",
"driver_manager.action.import_directory": "Treiberordner importieren",
"driver_manager.action.import_package": "Treiberpaket importieren",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "\"Treiberpaket importieren\" in der Zeile ist nur für eine einzelne Treiberdatei oder ein Bündel wie `mariadb-driver-agent`, `mariadb-driver-agent.exe` oder `GoNavi-DriverAgents.zip` vorgesehen. Ein JDBC Jar wird nicht direkt importiert; für Stapelimporte nutze oben \"Treiberordner importieren\".",
"driver_manager.local_source.directory": "Ordner",
"driver_manager.local_source.file": "Datei",
- "driver_manager.log_modal.empty": "Für diesen Treiber gibt es noch keine Vorgangsprotokolle.",
- "driver_manager.log_modal.executable_path": "Treiberprogramm: {{path}}",
- "driver_manager.log_modal.install_dir": "Installationsordner: {{path}}",
- "driver_manager.log_modal.title": "Treiberprotokoll - {{name}}",
"driver_manager.log.done_auto_install": "Automatische Installation abgeschlossen{{version}}",
"driver_manager.log.done_local_import": "Lokale Importinstallation abgeschlossen{{version}}",
"driver_manager.log.done_remove": "Treiberentfernung abgeschlossen",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "Automatische Installation gestartet",
"driver_manager.log.start_local_import": "Lokaler Import gestartet{{version}} ({{source}}): {{path}}",
"driver_manager.log.start_remove": "Treiberentfernung gestartet",
+ "driver_manager.log_modal.empty": "Für diesen Treiber gibt es noch keine Vorgangsprotokolle.",
+ "driver_manager.log_modal.executable_path": "Treiberprogramm: {{path}}",
+ "driver_manager.log_modal.install_dir": "Installationsordner: {{path}}",
+ "driver_manager.log_modal.title": "Treiberprotokoll - {{name}}",
"driver_manager.message.directory_import_completed": "Ordnerimport abgeschlossen{{mode}}: {{success}} erfolgreich{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "Ordnerimport abgeschlossen{{mode}}: {{success}} erfolgreich, {{failed}} fehlgeschlagen{{skip}}",
"driver_manager.message.directory_import_failed": "Ordnerimport fehlgeschlagen{{mode}}: {{failed}} fehlgeschlagen{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "Lokaler Treiberpaketordner konnte nicht ausgewählt werden: {{detail}}",
"driver_manager.message.select_local_file_failed": "Lokale Treiberpaketdatei konnte nicht ausgewählt werden",
"driver_manager.message.select_local_file_failed_detail": "Lokale Treiberpaketdatei konnte nicht ausgewählt werden: {{detail}}",
- "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.message.skip.dedupe": "{{count}} wegen Dubletten übersprungen",
"driver_manager.message.skip.slim": "{{count}} wegen Slim-Build übersprungen",
+ "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.network.alert.download_chain_unreachable": "Wichtig: Domains der Treiber-Downloadroute sind nicht erreichbar",
"driver_manager.network.alert.download_network_unreachable": "Wichtig: Treiber-Downloadnetzwerk ist nicht erreichbar",
"driver_manager.network.chain_alert.allow_hosts": "Wenn es weiter fehlschlägt, erlaube diese Hosts in den Proxy-Regeln: {{hosts}}. Wenn die Regeln nicht angepasst werden können, erwäge den TUN-Modus.",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "Aktuell installiert: {{installedVersion}}; ausgewählt: {{targetVersion}}. Klicke auf „Version wechseln“, um die Änderung anzuwenden.",
"driver_manager.version.target_fallback": "Zielversion",
"driver_manager.version.unlabeled": "Version ohne Kennzeichnung",
- "driver.guidance.customConnectionDriverHelp": "Unterstützt: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; Aliasse: postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Geben Sie einen bereits von GoNavi registrierten Go database/sql-Treibernamen ein. Geben Sie keinen System-ODBC/JDBC-Treibernamen direkt ein und importieren Sie kein JDBC Jar.",
"file.backend.dialog.export_connections": "Verbindungen exportieren",
"file.backend.dialog.export_data": "Daten exportieren",
"file.backend.dialog.export_database_sql": "{{database}} exportieren (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "Daten werden importiert...",
"import_preview.status.loading_preview": "Vorschaudaten werden geladen...",
"import_preview.title": "Datenimport-Vorschau",
+ "jvm.backend.capability.reason.read_only": "Aktuelle Verbindung ist schreibgeschützt",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "Gib eine vollständige http://- oder https://-URL ein, z. B. http://127.0.0.1:19090/gonavi/agent/jvm.",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent-Verbindung fehlgeschlagen: Agent Base URL ist ungültig.",
+ "jvm.backend.connection_error.agent.base_url_required": "Agent-Verbindung fehlgeschlagen: Agent Base URL fehlt.",
+ "jvm.backend.connection_error.agent.connection_refused.help": "Prüfe, ob der Java-Dienst den GoNavi Agent mit `-javaagent` gestartet hat, und prüfe Base URL, Port-Mapping und Firewall.",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Agent-Verbindung fehlgeschlagen: Der Ziel-Agent-Management-Port lauscht nicht oder die Adresse ist nicht erreichbar.",
+ "jvm.backend.connection_error.agent.forbidden.help": "Prüfe, ob Client-Quelle, Authentifizierung und Agent-Zugriffsrichtlinie GoNavi den Zugriff erlauben.",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Agent-Verbindung fehlgeschlagen: Agent hat diese Anfrage abgelehnt.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "Ändere Agent Base URL auf eine Adresse, die mit http:// oder https:// beginnt.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent-Verbindung fehlgeschlagen: nur HTTP oder HTTPS wird unterstützt.",
+ "jvm.backend.connection_error.agent.timeout.help": "Prüfe, ob die Zieladresse erreichbar ist, der Agent gestartet ist, und erhöhe bei Bedarf das Verbindungstimeout.",
+ "jvm.backend.connection_error.agent.timeout.summary": "Agent-Verbindung fehlgeschlagen: Zugriff auf den Agent-Management-Port ist abgelaufen.",
+ "jvm.backend.connection_error.agent.unauthorized.help": "Prüfe, ob der Agent API Key in der Verbindung zu den Startparametern des Zielservices passt.",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Agent-Verbindung fehlgeschlagen: Agent hat geantwortet, aber der API Key fehlt oder ist ungültig.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Gib eine vollständige http://- oder https://-URL ein, die auf den Management-API-Stammpfad mit GoNavi JVM HTTP contract zeigt, z. B. http://127.0.0.1:19090/manage/jvm.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint-Verbindung fehlgeschlagen: Endpoint Base URL ist ungültig.",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint-Verbindung fehlgeschlagen: Endpoint Base URL fehlt.",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "Prüfe, dass Base URL auf die Management-API mit GoNavi JVM HTTP contract zeigt, und prüfe Dienst-Listener, Port-Mapping und Firewall.",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API lauscht nicht oder die Adresse ist nicht erreichbar.",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "Prüfe, ob Client-Quelle, Authentifizierung und Zugriffsrichtlinie GoNavi den Zugriff auf diese Management-API erlauben.",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API hat diese Anfrage abgelehnt.",
+ "jvm.backend.connection_error.endpoint.not_found.help": "Prüfe, dass Base URL auf den Stamm der JVM-Management-API zeigt und nicht auf Business-Endpoint, Healthcheck oder Gateway-Startseite.",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint-Verbindung fehlgeschlagen: Das Ziel hat geantwortet, aber die GoNavi JVM-Management-API wurde nicht gefunden.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Ändere Endpoint Base URL auf eine Adresse, die mit http:// oder https:// beginnt.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint-Verbindung fehlgeschlagen: nur HTTP oder HTTPS wird unterstützt.",
+ "jvm.backend.connection_error.endpoint.timeout.help": "Prüfe, ob Base URL erreichbar ist, der Zielservice gestartet ist, und erhöhe bei Bedarf das Verbindungstimeout.",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint-Verbindung fehlgeschlagen: Zugriff auf die Ziel-Management-API ist abgelaufen.",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "Prüfe, ob der Endpoint API Key in der Verbindung zur Zielservice-Konfiguration passt.",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API hat geantwortet, aber der API Key fehlt oder ist ungültig.",
+ "jvm.backend.connection_error.generic": "JVM-Verbindung fehlgeschlagen",
+ "jvm.backend.connection_error.jmx.auth.help": "Prüfe, ob Ziel-JMX Authentifizierung deaktiviert. Falls Authentifizierung erforderlich ist, gib Benutzername und Passwort vor dem Verbinden an.",
+ "jvm.backend.connection_error.jmx.auth.summary": "JMX-Verbindung fehlgeschlagen: {{target}} erfordert Authentifizierung oder die aktuellen Zugangsdaten sind ungültig.",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "Prüfe, ob Remote-JMX auf der Ziel-JVM aktiviert ist, und prüfe Host, Firewall, Port-Mapping, SSH und Proxy.",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX-Verbindung fehlgeschlagen: Verbindung zu {{target}} nicht möglich, weil der Port nicht lauscht oder das Netzwerk nicht erreichbar ist.",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "Prüfe, ob der konfigurierte Port der exponierte JMX-Port der JVM ist und nicht Business-Port, Debug-Port oder Proxy-Weiterleitung.",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX-Verbindung fehlgeschlagen: Der Dienst auf {{target}} hat die Verbindung geschlossen; der Port ist kein kompatibler Standard-JMX-RMI-Port.",
+ "jvm.backend.connection_error.jmx.host_required": "JMX-Verbindung fehlgeschlagen: Host fehlt.",
+ "jvm.backend.connection_error.jmx.java_missing.help": "Installiere zuerst JRE/JDK oder setze die Umgebungsvariable GONAVI_JMX_JAVA_BIN auf die richtige `java`-Datei.",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "JMX-Verbindung fehlgeschlagen: Auf diesem Rechner wurde keine `java` runtime gefunden, daher kann GoNavi den JMX helper nicht starten.",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "Das bedeutet meist, dass ein RMI-Registry-Port, Debug-Port oder anderer Java-Service-Port verwendet wurde. Prüfe `jmxremote.port` und `jmxremote.rmi.port`.",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX-Verbindung fehlgeschlagen: Auf {{target}} läuft ein RMI-Dienst, aber kein verwendbarer JMX RMIServer-Port.",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "Verwende den tatsächlich von der Anwendung exponierten JMX-Port, nicht den Business-`server.port`. Wenn der Dienst nur `-Dcom.sun.management.jmxremote` aktiviert, aber keinen `jmxremote.port` setzt, ist keine direkte Remote-Verbindung möglich.",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX-Verbindung fehlgeschlagen: {{target}} ist kein Standardport für JMX remote management; er sieht eher wie ein Business- oder HTTP-Port aus.",
+ "jvm.backend.connection_error.jmx.port_invalid": "JMX-Verbindung fehlgeschlagen: Port ist ungültig. Gib einen gültigen Port von 1 bis 65535 ein.",
+ "jvm.backend.connection_error.jmx.timeout.help": "Prüfe, ob der Port erreichbar ist, das Netzwerk nicht blockiert wird, und erhöhe bei Bedarf das Verbindungstimeout.",
+ "jvm.backend.connection_error.jmx.timeout.summary": "JMX-Verbindung fehlgeschlagen: Verbindung zu {{target}} ist abgelaufen.",
+ "jvm.backend.connection_error.suggestion": "Vorschlag: {{detail}}",
+ "jvm.backend.connection_error.technical_detail": "Technisches Detail: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel-Adresse ist ungültig: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel-Adresse ist erforderlich",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "Der aktive Befehl in dieser Arthas Tunnel-Sitzung stimmt nicht mit dem abzubrechenden Befehl überein.",
+ "jvm.backend.diagnostic.arthas.command_already_running": "In dieser Arthas Tunnel-Sitzung läuft bereits ein Befehl. Warte auf den Abschluss oder brich ihn zuerst ab.",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel-Befehl wurde abgebrochen",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel-Befehl hat nach {{timeout}} eine Zeitüberschreitung erreicht",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket-Verbindung wurde abgebrochen",
+ "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket-Verbindung fehlgeschlagen: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket-Verbindung hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel-Verbindung wurde geschlossen: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel-Verbindung wurde geschlossen: code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel-Verbindung ist noch nicht bereit. Versuche es später erneut.",
+ "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel-Verbindung fehlgeschlagen: HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "In dieser Arthas Tunnel-Sitzung läuft kein Befehl.",
+ "jvm.backend.diagnostic.arthas.read_canceled": "Lesen der Arthas Tunnel-Ausgabe wurde abgebrochen",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel-Lesefrist konnte nicht gesetzt werden: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "Arthas Tunnel-Ausgabe konnte nicht gelesen werden: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "Lesen der Arthas Tunnel-Ausgabe hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel-Anfrage konnte nicht codiert werden: {{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel unterstützt nur http/https/ws/wss-Adressen: {{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "Senden des Arthas Tunnel-Terminalbefehls wurde abgebrochen",
+ "jvm.backend.diagnostic.arthas.send_failed": "Arthas Tunnel-Terminalbefehl konnte nicht gesendet werden: {{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "Senden des Arthas Tunnel-Terminalbefehls hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel-Sitzungskonfiguration hat sich geändert. Erstelle die Diagnosesitzung erneut.",
+ "jvm.backend.diagnostic.arthas.session_missing": "Diagnosesitzung existiert nicht. Erstelle die Arthas Tunnel-Sitzung erneut.",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel target ID ist erforderlich (targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "Zielinstanz wurde nicht gefunden. Prüfe targetId / agentId und ob der tunnel client online ist.",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Zielinstanz {{target}} wurde nicht gefunden. Prüfe targetId / agentId und ob der tunnel client online ist.",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel-Terminalbefehl konnte nicht codiert werden: {{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel-Schreibfrist konnte nicht gesetzt werden: {{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "Diagnose-Auditdatensatz konnte nicht geschrieben werden; Befehlsausführung wurde blockiert: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "Abbruchbefehl benötigt sessionId und commandId",
+ "jvm.backend.diagnostic.error.command_required": "Diagnosebefehl darf nicht leer sein",
+ "jvm.backend.diagnostic.error.disabled": "JVM-Diagnoseerweiterung ist für diese Verbindung nicht aktiviert",
+ "jvm.backend.diagnostic.error.execute_canceled": "Diagnose-Ausführungsanfrage wurde abgebrochen: {{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "Diagnosesitzungs-ID ist erforderlich. Erstelle zuerst eine Sitzung.",
+ "jvm.backend.diagnostic.error.transport_unsupported": "Nicht unterstützter JVM-Diagnosetransport: {{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas-Befehl abgebrochen",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas-Befehl abgeschlossen",
+ "jvm.backend.diagnostic.message.cancel_requested": "Abbruchanfrage gesendet; warte, bis die Diagnose-Bridge den Befehl beendet",
+ "jvm.backend.diagnostic.message.command_completed": "Diagnosebefehl abgeschlossen",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnosebefehl unterstützt keine Zeilenumbrüche oder mehrere Befehle",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "Hochriskante Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe-Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "Die aktuelle Verbindung ist schreibgeschützt. Nur Observe-Diagnosebefehle sind erlaubt",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace-Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "Auditdatensatz konnte nicht geschrieben werden; JVM-Änderung wurde blockiert: {{detail}}",
+ "jvm.backend.error.change_action_required": "JVM-Änderungsaktion ist erforderlich",
+ "jvm.backend.error.change_blocked_by_guard": "Die aktuelle Änderung wurde von Guard blockiert",
+ "jvm.backend.error.change_blocked_read_only": "Die aktuelle Verbindung ist schreibgeschützt, daher werden Schreibvorgänge blockiert",
+ "jvm.backend.error.change_confirmation_token_failed": "JVM-Änderungsbestätigungstoken konnte nicht erzeugt werden: {{detail}}",
+ "jvm.backend.error.change_reason_required": "JVM-Änderungsgrund ist erforderlich",
+ "jvm.backend.error.change_resource_id_required": "JVM-Ressourcen-ID ist erforderlich",
+ "jvm.backend.error.confirmation_token_expired": "Bestätigungstoken ist abgelaufen. Vorschau erneut ausführen und bestätigen.",
+ "jvm.backend.error.confirmation_token_invalid": "Bestätigungstoken ist ungültig. Vorschau erneut ausführen und bestätigen.",
+ "jvm.backend.error.confirmation_token_missing": "Bestätigungstoken fehlt. Schließe zuerst die Vorschau-Bestätigung ab.",
+ "jvm.backend.error.disallowed_mode": "Die aktuelle Verbindung erlaubt den Modus {{mode}} nicht",
+ "jvm.backend.error.preview_confirmation_missing": "Bestätigungstoken der Vorschau fehlt. Vorschau vor dem Senden erneut ausführen.",
+ "jvm.backend.error.preview_context_hash_failed": "JVM-Vorschaukontext konnte nicht erzeugt werden: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "JVM-Vorschau-Payload-Digest konnte nicht erzeugt werden: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "Ungültiger JVM-Ressourcenpfad: {{detail}}",
+ "jvm.backend.message.connect_success": "JVM-Verbindung erfolgreich",
+ "jvm.backend.monitoring.error.session_not_found": "JVM-Überwachungssitzung für {{connectionId}} {{providerMode}} nicht gefunden",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} Überwachungssnapshot wird noch nicht unterstützt",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "Die Monitoring-Abfrage ist {{count}} Mal in Folge fehlgeschlagen; diese Sitzung wurde automatisch beendet",
+ "jvm.backend.separator.message_warning": "; ",
+ "jvm.backend.warning.failed_audit_write_failed": "Fehler-Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "Abschluss-Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
"jvm_ai_plan.actions.description": ": {{description}}",
"jvm_ai_plan.actions.field_separator": ", ",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "AI-Diagnoseplan: {{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "Der Diagnose-transport des AI-Plans ist {{planTransport}} und stimmt nicht mit der aktuellen Konsole {{currentTransport}} überein. Erstellen Sie den Plan vor dem Anwenden erneut.",
"jvm_diagnostic.ai_plan.message.filled": "AI-Diagnoseplan wurde in die Konsole übernommen",
+ "jvm_diagnostic.capability.empty.description": "Die Funktionsprüfung liest nur Kanalberechtigungen und Befehlsrichtlinien. Sie erstellt keine Sitzung und führt keine Befehle aus.",
+ "jvm_diagnostic.capability.empty.title": "Funktionen noch nicht geprüft",
"jvm_diagnostic.capability_result.mutating_allowed": "Hochrisikobefehle",
"jvm_diagnostic.capability_result.observe_allowed": "Observe-Befehle",
"jvm_diagnostic.capability_result.observe_denied": "Observe gesperrt",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "Streaming nicht unterstützt",
"jvm_diagnostic.capability_result.title": "Ergebnis der Funktionsprüfung",
"jvm_diagnostic.capability_result.trace_allowed": "Trace-Befehle",
- "jvm_diagnostic.capability.empty.description": "Die Funktionsprüfung liest nur Kanalberechtigungen und Befehlsrichtlinien. Sie erstellt keine Sitzung und führt keine Befehle aus.",
- "jvm_diagnostic.capability.empty.title": "Funktionen noch nicht geprüft",
"jvm_diagnostic.command_input.command_description": "Geben Sie einen Arthas-/Diagnosebefehl ein, zum Beispiel thread -n 5, dashboard oder jvm; die Vorlagen unten können ihn mit einem Klick einfügen.",
"jvm_diagnostic.command_input.command_label": "Diagnosebefehl",
"jvm_diagnostic.command_input.description": "Unterstützt Autovervollständigung. Mit Ctrl/Cmd + Enter ausführen.",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "Manuelle Eingabe",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "Sitzung aus der Konsole gestartet",
+ "jvm_diagnostic.session.default_title": "JVM-Diagnosekonsole",
"jvm_diagnostic.session_capability.action.clear_output": "Ausgabe löschen",
"jvm_diagnostic.session_capability.action.refresh_history": "Verlauf aktualisieren",
"jvm_diagnostic.session_capability.description": "Aktueller Kanal, Berechtigungen und Schnellwartung",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "Keine Sitzung",
"jvm_diagnostic.session_capability.status.session_established": "Sitzung hergestellt",
"jvm_diagnostic.session_capability.title": "Sitzung und Funktionen",
- "jvm_diagnostic.session.default_reason": "Sitzung aus der Konsole gestartet",
- "jvm_diagnostic.session.default_title": "JVM-Diagnosekonsole",
"jvm_diagnostic.workbench.action.cancel_command": "Befehl abbrechen",
"jvm_diagnostic.workbench.action.execute_command": "Befehl ausführen",
"jvm_diagnostic.workbench.action.probe": "Funktionen prüfen",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "Ressourcenwert",
"jvm_resource.section.supported_actions": "Unterstützte Ressourcenaktionen",
"jvm_resource.title": "JVM-Ressourcenarbeitsbereich",
- "jvm.backend.capability.reason.read_only": "Aktuelle Verbindung ist schreibgeschützt",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "Gib eine vollständige http://- oder https://-URL ein, z. B. http://127.0.0.1:19090/gonavi/agent/jvm.",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent-Verbindung fehlgeschlagen: Agent Base URL ist ungültig.",
- "jvm.backend.connection_error.agent.base_url_required": "Agent-Verbindung fehlgeschlagen: Agent Base URL fehlt.",
- "jvm.backend.connection_error.agent.connection_refused.help": "Prüfe, ob der Java-Dienst den GoNavi Agent mit `-javaagent` gestartet hat, und prüfe Base URL, Port-Mapping und Firewall.",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Agent-Verbindung fehlgeschlagen: Der Ziel-Agent-Management-Port lauscht nicht oder die Adresse ist nicht erreichbar.",
- "jvm.backend.connection_error.agent.forbidden.help": "Prüfe, ob Client-Quelle, Authentifizierung und Agent-Zugriffsrichtlinie GoNavi den Zugriff erlauben.",
- "jvm.backend.connection_error.agent.forbidden.summary": "Agent-Verbindung fehlgeschlagen: Agent hat diese Anfrage abgelehnt.",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "Ändere Agent Base URL auf eine Adresse, die mit http:// oder https:// beginnt.",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent-Verbindung fehlgeschlagen: nur HTTP oder HTTPS wird unterstützt.",
- "jvm.backend.connection_error.agent.timeout.help": "Prüfe, ob die Zieladresse erreichbar ist, der Agent gestartet ist, und erhöhe bei Bedarf das Verbindungstimeout.",
- "jvm.backend.connection_error.agent.timeout.summary": "Agent-Verbindung fehlgeschlagen: Zugriff auf den Agent-Management-Port ist abgelaufen.",
- "jvm.backend.connection_error.agent.unauthorized.help": "Prüfe, ob der Agent API Key in der Verbindung zu den Startparametern des Zielservices passt.",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Agent-Verbindung fehlgeschlagen: Agent hat geantwortet, aber der API Key fehlt oder ist ungültig.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Gib eine vollständige http://- oder https://-URL ein, die auf den Management-API-Stammpfad mit GoNavi JVM HTTP contract zeigt, z. B. http://127.0.0.1:19090/manage/jvm.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint-Verbindung fehlgeschlagen: Endpoint Base URL ist ungültig.",
- "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint-Verbindung fehlgeschlagen: Endpoint Base URL fehlt.",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "Prüfe, dass Base URL auf die Management-API mit GoNavi JVM HTTP contract zeigt, und prüfe Dienst-Listener, Port-Mapping und Firewall.",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API lauscht nicht oder die Adresse ist nicht erreichbar.",
- "jvm.backend.connection_error.endpoint.forbidden.help": "Prüfe, ob Client-Quelle, Authentifizierung und Zugriffsrichtlinie GoNavi den Zugriff auf diese Management-API erlauben.",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API hat diese Anfrage abgelehnt.",
- "jvm.backend.connection_error.endpoint.not_found.help": "Prüfe, dass Base URL auf den Stamm der JVM-Management-API zeigt und nicht auf Business-Endpoint, Healthcheck oder Gateway-Startseite.",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint-Verbindung fehlgeschlagen: Das Ziel hat geantwortet, aber die GoNavi JVM-Management-API wurde nicht gefunden.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Ändere Endpoint Base URL auf eine Adresse, die mit http:// oder https:// beginnt.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint-Verbindung fehlgeschlagen: nur HTTP oder HTTPS wird unterstützt.",
- "jvm.backend.connection_error.endpoint.timeout.help": "Prüfe, ob Base URL erreichbar ist, der Zielservice gestartet ist, und erhöhe bei Bedarf das Verbindungstimeout.",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint-Verbindung fehlgeschlagen: Zugriff auf die Ziel-Management-API ist abgelaufen.",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "Prüfe, ob der Endpoint API Key in der Verbindung zur Zielservice-Konfiguration passt.",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint-Verbindung fehlgeschlagen: Die Ziel-Management-API hat geantwortet, aber der API Key fehlt oder ist ungültig.",
- "jvm.backend.connection_error.generic": "JVM-Verbindung fehlgeschlagen",
- "jvm.backend.connection_error.jmx.auth.help": "Prüfe, ob Ziel-JMX Authentifizierung deaktiviert. Falls Authentifizierung erforderlich ist, gib Benutzername und Passwort vor dem Verbinden an.",
- "jvm.backend.connection_error.jmx.auth.summary": "JMX-Verbindung fehlgeschlagen: {{target}} erfordert Authentifizierung oder die aktuellen Zugangsdaten sind ungültig.",
- "jvm.backend.connection_error.jmx.connection_refused.help": "Prüfe, ob Remote-JMX auf der Ziel-JVM aktiviert ist, und prüfe Host, Firewall, Port-Mapping, SSH und Proxy.",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX-Verbindung fehlgeschlagen: Verbindung zu {{target}} nicht möglich, weil der Port nicht lauscht oder das Netzwerk nicht erreichbar ist.",
- "jvm.backend.connection_error.jmx.connection_reset.help": "Prüfe, ob der konfigurierte Port der exponierte JMX-Port der JVM ist und nicht Business-Port, Debug-Port oder Proxy-Weiterleitung.",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX-Verbindung fehlgeschlagen: Der Dienst auf {{target}} hat die Verbindung geschlossen; der Port ist kein kompatibler Standard-JMX-RMI-Port.",
- "jvm.backend.connection_error.jmx.host_required": "JMX-Verbindung fehlgeschlagen: Host fehlt.",
- "jvm.backend.connection_error.jmx.java_missing.help": "Installiere zuerst JRE/JDK oder setze die Umgebungsvariable GONAVI_JMX_JAVA_BIN auf die richtige `java`-Datei.",
- "jvm.backend.connection_error.jmx.java_missing.summary": "JMX-Verbindung fehlgeschlagen: Auf diesem Rechner wurde keine `java` runtime gefunden, daher kann GoNavi den JMX helper nicht starten.",
- "jvm.backend.connection_error.jmx.no_such_object.help": "Das bedeutet meist, dass ein RMI-Registry-Port, Debug-Port oder anderer Java-Service-Port verwendet wurde. Prüfe `jmxremote.port` und `jmxremote.rmi.port`.",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX-Verbindung fehlgeschlagen: Auf {{target}} läuft ein RMI-Dienst, aber kein verwendbarer JMX RMIServer-Port.",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "Verwende den tatsächlich von der Anwendung exponierten JMX-Port, nicht den Business-`server.port`. Wenn der Dienst nur `-Dcom.sun.management.jmxremote` aktiviert, aber keinen `jmxremote.port` setzt, ist keine direkte Remote-Verbindung möglich.",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX-Verbindung fehlgeschlagen: {{target}} ist kein Standardport für JMX remote management; er sieht eher wie ein Business- oder HTTP-Port aus.",
- "jvm.backend.connection_error.jmx.port_invalid": "JMX-Verbindung fehlgeschlagen: Port ist ungültig. Gib einen gültigen Port von 1 bis 65535 ein.",
- "jvm.backend.connection_error.jmx.timeout.help": "Prüfe, ob der Port erreichbar ist, das Netzwerk nicht blockiert wird, und erhöhe bei Bedarf das Verbindungstimeout.",
- "jvm.backend.connection_error.jmx.timeout.summary": "JMX-Verbindung fehlgeschlagen: Verbindung zu {{target}} ist abgelaufen.",
- "jvm.backend.connection_error.suggestion": "Vorschlag: {{detail}}",
- "jvm.backend.connection_error.technical_detail": "Technisches Detail: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel-Adresse ist ungültig: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel-Adresse ist erforderlich",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "Der aktive Befehl in dieser Arthas Tunnel-Sitzung stimmt nicht mit dem abzubrechenden Befehl überein.",
- "jvm.backend.diagnostic.arthas.command_already_running": "In dieser Arthas Tunnel-Sitzung läuft bereits ein Befehl. Warte auf den Abschluss oder brich ihn zuerst ab.",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel-Befehl wurde abgebrochen",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel-Befehl hat nach {{timeout}} eine Zeitüberschreitung erreicht",
- "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket-Verbindung wurde abgebrochen",
- "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket-Verbindung fehlgeschlagen: {{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket-Verbindung hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
- "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel-Verbindung wurde geschlossen: {{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel-Verbindung wurde geschlossen: code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel-Verbindung ist noch nicht bereit. Versuche es später erneut.",
- "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel-Verbindung fehlgeschlagen: HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "In dieser Arthas Tunnel-Sitzung läuft kein Befehl.",
- "jvm.backend.diagnostic.arthas.read_canceled": "Lesen der Arthas Tunnel-Ausgabe wurde abgebrochen",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel-Lesefrist konnte nicht gesetzt werden: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "Arthas Tunnel-Ausgabe konnte nicht gelesen werden: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "Lesen der Arthas Tunnel-Ausgabe hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel-Anfrage konnte nicht codiert werden: {{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel unterstützt nur http/https/ws/wss-Adressen: {{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "Senden des Arthas Tunnel-Terminalbefehls wurde abgebrochen",
- "jvm.backend.diagnostic.arthas.send_failed": "Arthas Tunnel-Terminalbefehl konnte nicht gesendet werden: {{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "Senden des Arthas Tunnel-Terminalbefehls hat nach {{timeout}} ohne Antwort eine Zeitüberschreitung erreicht",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel-Sitzungskonfiguration hat sich geändert. Erstelle die Diagnosesitzung erneut.",
- "jvm.backend.diagnostic.arthas.session_missing": "Diagnosesitzung existiert nicht. Erstelle die Arthas Tunnel-Sitzung erneut.",
- "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel target ID ist erforderlich (targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "Zielinstanz wurde nicht gefunden. Prüfe targetId / agentId und ob der tunnel client online ist.",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Zielinstanz {{target}} wurde nicht gefunden. Prüfe targetId / agentId und ob der tunnel client online ist.",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel-Terminalbefehl konnte nicht codiert werden: {{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel-Schreibfrist konnte nicht gesetzt werden: {{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "Diagnose-Auditdatensatz konnte nicht geschrieben werden; Befehlsausführung wurde blockiert: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "Abbruchbefehl benötigt sessionId und commandId",
- "jvm.backend.diagnostic.error.command_required": "Diagnosebefehl darf nicht leer sein",
- "jvm.backend.diagnostic.error.disabled": "JVM-Diagnoseerweiterung ist für diese Verbindung nicht aktiviert",
- "jvm.backend.diagnostic.error.execute_canceled": "Diagnose-Ausführungsanfrage wurde abgebrochen: {{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "Diagnosesitzungs-ID ist erforderlich. Erstelle zuerst eine Sitzung.",
- "jvm.backend.diagnostic.error.transport_unsupported": "Nicht unterstützter JVM-Diagnosetransport: {{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas-Befehl abgebrochen",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas-Befehl abgeschlossen",
- "jvm.backend.diagnostic.message.cancel_requested": "Abbruchanfrage gesendet; warte, bis die Diagnose-Bridge den Befehl beendet",
- "jvm.backend.diagnostic.message.command_completed": "Diagnosebefehl abgeschlossen",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnosebefehl unterstützt keine Zeilenumbrüche oder mehrere Befehle",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "Hochriskante Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe-Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "Die aktuelle Verbindung ist schreibgeschützt. Nur Observe-Diagnosebefehle sind erlaubt",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace-Diagnosebefehle sind für diese Verbindung nicht aktiviert: {{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "Auditdatensatz konnte nicht geschrieben werden; JVM-Änderung wurde blockiert: {{detail}}",
- "jvm.backend.error.change_action_required": "JVM-Änderungsaktion ist erforderlich",
- "jvm.backend.error.change_blocked_by_guard": "Die aktuelle Änderung wurde von Guard blockiert",
- "jvm.backend.error.change_blocked_read_only": "Die aktuelle Verbindung ist schreibgeschützt, daher werden Schreibvorgänge blockiert",
- "jvm.backend.error.change_confirmation_token_failed": "JVM-Änderungsbestätigungstoken konnte nicht erzeugt werden: {{detail}}",
- "jvm.backend.error.change_reason_required": "JVM-Änderungsgrund ist erforderlich",
- "jvm.backend.error.change_resource_id_required": "JVM-Ressourcen-ID ist erforderlich",
- "jvm.backend.error.confirmation_token_expired": "Bestätigungstoken ist abgelaufen. Vorschau erneut ausführen und bestätigen.",
- "jvm.backend.error.confirmation_token_invalid": "Bestätigungstoken ist ungültig. Vorschau erneut ausführen und bestätigen.",
- "jvm.backend.error.confirmation_token_missing": "Bestätigungstoken fehlt. Schließe zuerst die Vorschau-Bestätigung ab.",
- "jvm.backend.error.disallowed_mode": "Die aktuelle Verbindung erlaubt den Modus {{mode}} nicht",
- "jvm.backend.error.preview_confirmation_missing": "Bestätigungstoken der Vorschau fehlt. Vorschau vor dem Senden erneut ausführen.",
- "jvm.backend.error.preview_context_hash_failed": "JVM-Vorschaukontext konnte nicht erzeugt werden: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "JVM-Vorschau-Payload-Digest konnte nicht erzeugt werden: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "Ungültiger JVM-Ressourcenpfad: {{detail}}",
- "jvm.backend.message.connect_success": "JVM-Verbindung erfolgreich",
- "jvm.backend.monitoring.error.session_not_found": "JVM-Überwachungssitzung für {{connectionId}} {{providerMode}} nicht gefunden",
- "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} Überwachungssnapshot wird noch nicht unterstützt",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "Die Monitoring-Abfrage ist {{count}} Mal in Folge fehlgeschlagen; diese Sitzung wurde automatisch beendet",
- "jvm.backend.separator.message_warning": "; ",
- "jvm.backend.warning.failed_audit_write_failed": "Fehler-Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "Abschluss-Auditdatensatz konnte nicht geschrieben werden: {{detail}}",
"log_panel.action.clear": "Logs leeren",
"log_panel.action.close": "Panel schliessen",
"log_panel.affected_rows": "Betroffene Zeilen: {{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "Keine SQL-Ausfuehrungslogs",
"log_panel.short_title": "Logs",
"log_panel.title": "SQL-Ausfuehrungslog",
- "message_publish_modal.action.send": "Senden",
- "message_publish_modal.error.build_command_failed": "Sende-Befehl konnte nicht erstellt werden",
- "message_publish_modal.error.send_failed_detail": "Senden fehlgeschlagen: {{detail}}",
- "message_publish_modal.error.unknown_error": "Unbekannter Fehler",
- "message_publish_modal.field.body_mode.label": "Nachrichtentext-Typ",
- "message_publish_modal.field.body.extra": "Im JSON-Modus ist gültiges JSON erforderlich. Der Textmodus sendet den Inhalt unverändert.",
- "message_publish_modal.field.body.label": "Nachrichtentext",
- "message_publish_modal.field.body.placeholder": "Nachrichtentext eingeben",
- "message_publish_modal.field.body.required": "Nachrichtentext eingeben",
- "message_publish_modal.field.delay_level.extra": "RocketMQ verwendet feste Verzögerungsstufen. 0 sendet sofort.",
- "message_publish_modal.field.delay_level.label": "Delay Level (optional)",
- "message_publish_modal.field.exchange.extra": "Leer lassen, um den Standard-Exchange zu verwenden. Wenn Sie einen eigenen Exchange eingeben, stellen Sie sicher, dass die Ziel-Queue ein binding hat.",
- "message_publish_modal.field.exchange.label": "Exchange (optional)",
- "message_publish_modal.field.exchange.placeholder": "Beispiel: events.topic",
- "message_publish_modal.field.headers.extra": "Muss ein JSON-Objekt sein, zum Beispiel {{example}}.",
- "message_publish_modal.field.headers.label": "Headers (optional)",
- "message_publish_modal.field.properties.extra": "Muss ein JSON-Objekt sein, zum Beispiel {{example}}.",
- "message_publish_modal.field.properties.label": "Properties (optional)",
- "message_publish_modal.field.qos.extra": "0 ist at most once, 1 ist at least once und 2 ist exactly once.",
- "message_publish_modal.field.retain.label": "Retain-Nachricht",
- "message_publish_modal.field.routing_key.extra": "Leer lassen, um standardmäßig den aktuellen Queue-Namen zu verwenden.",
- "message_publish_modal.field.routing_key.label": "Routing Key (optional)",
- "message_publish_modal.field.routing_key.placeholder": "Beispiel: orders.queue",
- "message_publish_modal.field.tag.extra": "Leer lassen, um nicht nach Tag zu filtern oder keinen Tag zu schreiben.",
- "message_publish_modal.field.tag.label": "Tag (optional)",
- "message_publish_modal.footer.success_prefix": "Nach erfolgreichem Senden wird",
- "message_publish_modal.footer.success_suffix": " zurückgegeben, um zu bestätigen, ob diese Testnachricht übermittelt wurde.",
- "message_publish_modal.option.no_delay": "Keine Verzögerung",
- "message_publish_modal.option.text": "Text",
- "message_publish_modal.title": "Nachricht testweise senden",
- "message_publish_modal.title_with_connection": "Nachricht testweise senden · {{connectionName}}",
"message_publish.error.destination_required": "Ziel-Topic / Queue eingeben",
"message_publish.error.invalid_json_detail": "{{field}} ist kein gültiges JSON: {{detail}}",
"message_publish.error.json_object_required": "{{field}} muss ein JSON-Objekt sein",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag, Keys, Delay Level und Properties werden in die RocketMQ-Nachrichtenattribute geschrieben.",
"message_publish.presentation.rocketmq.tag_placeholder": "Beispiel: TagA",
"message_publish.presentation.topic_required": "Topic eingeben",
+ "message_publish_modal.action.send": "Senden",
+ "message_publish_modal.error.build_command_failed": "Sende-Befehl konnte nicht erstellt werden",
+ "message_publish_modal.error.send_failed_detail": "Senden fehlgeschlagen: {{detail}}",
+ "message_publish_modal.error.unknown_error": "Unbekannter Fehler",
+ "message_publish_modal.field.body.extra": "Im JSON-Modus ist gültiges JSON erforderlich. Der Textmodus sendet den Inhalt unverändert.",
+ "message_publish_modal.field.body.label": "Nachrichtentext",
+ "message_publish_modal.field.body.placeholder": "Nachrichtentext eingeben",
+ "message_publish_modal.field.body.required": "Nachrichtentext eingeben",
+ "message_publish_modal.field.body_mode.label": "Nachrichtentext-Typ",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ verwendet feste Verzögerungsstufen. 0 sendet sofort.",
+ "message_publish_modal.field.delay_level.label": "Delay Level (optional)",
+ "message_publish_modal.field.exchange.extra": "Leer lassen, um den Standard-Exchange zu verwenden. Wenn Sie einen eigenen Exchange eingeben, stellen Sie sicher, dass die Ziel-Queue ein binding hat.",
+ "message_publish_modal.field.exchange.label": "Exchange (optional)",
+ "message_publish_modal.field.exchange.placeholder": "Beispiel: events.topic",
+ "message_publish_modal.field.headers.extra": "Muss ein JSON-Objekt sein, zum Beispiel {{example}}.",
+ "message_publish_modal.field.headers.label": "Headers (optional)",
+ "message_publish_modal.field.properties.extra": "Muss ein JSON-Objekt sein, zum Beispiel {{example}}.",
+ "message_publish_modal.field.properties.label": "Properties (optional)",
+ "message_publish_modal.field.qos.extra": "0 ist at most once, 1 ist at least once und 2 ist exactly once.",
+ "message_publish_modal.field.retain.label": "Retain-Nachricht",
+ "message_publish_modal.field.routing_key.extra": "Leer lassen, um standardmäßig den aktuellen Queue-Namen zu verwenden.",
+ "message_publish_modal.field.routing_key.label": "Routing Key (optional)",
+ "message_publish_modal.field.routing_key.placeholder": "Beispiel: orders.queue",
+ "message_publish_modal.field.tag.extra": "Leer lassen, um nicht nach Tag zu filtern oder keinen Tag zu schreiben.",
+ "message_publish_modal.field.tag.label": "Tag (optional)",
+ "message_publish_modal.footer.success_prefix": "Nach erfolgreichem Senden wird",
+ "message_publish_modal.footer.success_suffix": " zurückgegeben, um zu bestätigen, ob diese Testnachricht übermittelt wurde.",
+ "message_publish_modal.option.no_delay": "Keine Verzögerung",
+ "message_publish_modal.option.text": "Text",
+ "message_publish_modal.title": "Nachricht testweise senden",
+ "message_publish_modal.title_with_connection": "Nachricht testweise senden · {{connectionName}}",
"proxy.backend.error.host_empty": "Proxy-Host ist leer",
"proxy.backend.error.http_connect_failed": "Verbindung zum HTTP-Proxy fehlgeschlagen: {{detail}}",
"proxy.backend.error.http_connect_read_failed": "Lesen der HTTP CONNECT-Antwort fehlgeschlagen: {{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "SOCKS5-Proxy-Verbindung fehlgeschlagen: {{detail}}",
"proxy.backend.error.socks5_dialer_failed": "SOCKS5-Proxy-Dialer konnte nicht erstellt werden: {{detail}}",
"proxy.backend.error.unsupported_type": "Nicht unterstützter Proxy-Typ: {{type}}",
+ "query.format": "SQL formatieren",
+ "query.new": "Neue Abfrage",
+ "query.run": "Ausführen",
+ "query.save": "Abfrage speichern",
+ "query.stop": "Stoppen",
"query_editor.action.ai_explain_sql": "SQL mit AI erklären",
"query_editor.action.ai_explain_sql_menu": "SQL erklären",
"query_editor.action.ai_generate_sql": "SQL mit AI erzeugen",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "Schema-Analyse",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "SQL-Datei exportieren",
- "query_editor.action.format": "Formatieren",
"query_editor.action.find_in_editor": "Suchen",
"query_editor.action.find_in_editor_with_shortcut": "Im Editor suchen ({{shortcut}})",
+ "query_editor.action.format": "Formatieren",
"query_editor.action.format_sql": "SQL formatieren",
"query_editor.action.format_sql_with_shortcut": "SQL formatieren ({{shortcut}})",
"query_editor.action.hide_results_panel": "Ergebnisbereich ausblenden",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "Max. Zeilen: 5000",
"query_editor.max_rows.option_unlimited": "Max. Zeilen: unbegrenzt",
"query_editor.max_rows.tooltip": "Maximale Anzahl zurückgegebener Zeilen. SELECT erhält automatisch ein LIMIT, damit sehr große Ergebnismengen die Oberfläche nicht blockieren.",
+ "query_editor.message.ai_model_missing": "Für den aktiven AI Provider ist kein Modell ausgewählt. Wählen Sie zuerst in den AI-Einstellungen ein Modell aus.",
+ "query_editor.message.ai_provider_missing": "Konfigurieren und aktivieren Sie zuerst einen AI Provider in den AI-Einstellungen.",
+ "query_editor.message.ai_service_unavailable": "Der AI-Dienst ist noch nicht bereit. Versuchen Sie es später erneut oder prüfen Sie die AI-Einstellungen.",
"query_editor.message.append_success": "Code angehängt.",
"query_editor.message.cancel_failed": "Abfrage konnte nicht abgebrochen werden: {{error}}",
"query_editor.message.cancel_no_running": "Keine laufende Abfrage zum Abbrechen.",
"query_editor.message.cancel_success": "Abfrage abgebrochen.",
"query_editor.message.connection_not_found": "Verbindung nicht gefunden.",
"query_editor.message.connection_readonly_blocked": "Für diese Verbindung ist der Produktionsschutz aktiv; es sind nur Abfragen erlaubt.",
+ "query_editor.message.current_line_no_copyable_content": "Die aktuelle Zeile enthält keinen kopierbaren Inhalt.",
"query_editor.message.execution_failed_with_error": "Abfrageausführung fehlgeschlagen: {{error}}",
"query_editor.message.execution_multi_success": "{{statements}} Anweisungen ausgeführt und {{results}} Ergebnismengen erzeugt.",
"query_editor.message.execution_result_sets_success": "Ausführung abgeschlossen und {{results}} Ergebnismengen erzeugt.",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "Formatierung fehlgeschlagen: Die SQL-Syntax ist möglicherweise ungültig.",
"query_editor.message.format_restore_success": "Der SQL-Stand vor der Formatierung wurde wiederhergestellt.",
"query_editor.message.insert_success": "Code an der aktuellen Cursorposition eingefügt.",
- "query_editor.message.ai_model_missing": "Für den aktiven AI Provider ist kein Modell ausgewählt. Wählen Sie zuerst in den AI-Einstellungen ein Modell aus.",
- "query_editor.message.ai_provider_missing": "Konfigurieren und aktivieren Sie zuerst einen AI Provider in den AI-Einstellungen.",
- "query_editor.message.ai_service_unavailable": "Der AI-Dienst ist noch nicht bereit. Versuchen Sie es später erneut oder prüfen Sie die AI-Einstellungen.",
"query_editor.message.no_executable_sql": "Kein ausführbares SQL.",
"query_editor.message.no_format_restore_snapshot": "Es ist kein SQL-Stand vor der Formatierung zum Wiederherstellen verfügbar.",
- "query_editor.message.current_line_no_copyable_content": "Die aktuelle Zeile enthält keinen kopierbaren Inhalt.",
"query_editor.message.no_selectable_sql": "Keine auswählbare SQL-Anweisung.",
"query_editor.message.object_info_target_not_found": "Der Cursor befindet sich auf keiner erkannten Tabelle oder Spalte.",
"query_editor.message.page_query_empty": "Die Seitenabfrage hat keine Ergebnismenge zurückgegeben.",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "Ergebnis {{index}} ✓",
"query_editor.results_panel.action.hide": "Ausblenden",
"query_editor.results_panel.aria.hide": "Ergebnisbereich ausblenden",
+ "query_editor.results_panel.detached.close": "Fenster schließen",
+ "query_editor.results_panel.detached.restore": "Als Ergebnis-Tab wiederherstellen",
+ "query_editor.results_panel.detached.title": "Ergebnis {{index}}",
"query_editor.results_panel.menu.close_all": "Alle Tabs schließen",
"query_editor.results_panel.menu.close_left": "Tabs links schließen",
"query_editor.results_panel.menu.close_other": "Andere Tabs schließen",
"query_editor.results_panel.menu.close_right": "Tabs rechts schließen",
+ "query_editor.results_panel.menu.open_in_window": "In schwebendem Fenster öffnen",
+ "query_editor.results_panel.menu.restore_to_tab": "Als Ergebnis-Tab wiederherstellen",
"query_editor.results_panel.message.action.copy": "Kopieren",
"query_editor.results_panel.message.copy_failed": "Nachricht konnte nicht kopiert werden: {{detail}}",
"query_editor.results_panel.message.copy_unsupported": "Die Zwischenablage ist in der aktuellen Umgebung nicht verfügbar",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "Abfrage umbenennen",
"query_editor.save_modal.title": "Abfrage speichern",
"query_editor.save_modal.unnamed": "Unbenannte Abfrage",
- "query_editor.snippet_picker.description": "Wählen Sie ein vorhandenes SQL-Snippet aus und fügen Sie es an der aktuellen Cursorposition ein.",
- "query_editor.snippet_picker.empty": "Es sind noch keine SQL-Snippets verfügbar. Öffnen Sie die Snippet-Verwaltung, um Snippets hinzuzufügen oder Standardwerte wiederherzustellen.",
- "query_editor.snippet_picker.empty_filtered": "Keine SQL-Snippets entsprechen dem aktuellen Filter.",
- "query_editor.snippet_picker.manage": "Snippets verwalten",
- "query_editor.snippet_picker.search_placeholder": "Nach Präfix, Name oder Inhalt suchen",
- "query_editor.snippet_picker.title": "SQL-Snippet einfügen",
"query_editor.slash_command.diff.description": "Tabellenunterschiede vergleichen und Änderungen erzeugen",
"query_editor.slash_command.diff.label": "Tabellenvergleich",
"query_editor.slash_command.diff.prompt": "Vergleiche diese zwei Tabellenstrukturen und erzeuge ALTER-Anweisungen für die Migration von der alten zur neuen Version.",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "Anforderung beschreiben und Anweisung erzeugen",
"query_editor.slash_command.sql.label": "SQL erzeugen",
"query_editor.slash_command.sql.prompt": "Erzeuge SQL für diese Anforderung:",
- "query_editor.text_to_sql.description": "Beschreiben Sie die Daten, die Sie abfragen oder ändern möchten. GoNavi nutzt die aktuelle Verbindung, Datenbank und geladene Schema-Informationen zum Erzeugen von SQL.",
- "query_editor.text_to_sql.generate": "SQL erzeugen",
- "query_editor.text_to_sql.mode.insert": "Am Cursor einfügen",
- "query_editor.text_to_sql.mode.replace_all": "Alles ersetzen",
- "query_editor.text_to_sql.mode.replace_selection": "Auswahl ersetzen",
- "query_editor.text_to_sql.placeholder": "Beispiel: tägliche Bestellsumme der letzten 30 Tage zusammenfassen und nach Datum aufsteigend sortieren",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "Wählen Sie ein vorhandenes SQL-Snippet aus und fügen Sie es an der aktuellen Cursorposition ein.",
+ "query_editor.snippet_picker.empty": "Es sind noch keine SQL-Snippets verfügbar. Öffnen Sie die Snippet-Verwaltung, um Snippets hinzuzufügen oder Standardwerte wiederherzustellen.",
+ "query_editor.snippet_picker.empty_filtered": "Keine SQL-Snippets entsprechen dem aktuellen Filter.",
+ "query_editor.snippet_picker.manage": "Snippets verwalten",
+ "query_editor.snippet_picker.search_placeholder": "Nach Präfix, Name oder Inhalt suchen",
+ "query_editor.snippet_picker.title": "SQL-Snippet einfügen",
"query_editor.sql_error.rule.column_missing.explanation": "Das SQL verweist auf eine Spalte, die nicht im Ergebnissatz enthalten ist, anders geschrieben wurde oder in der aktuellen Tabelle nicht existiert.",
"query_editor.sql_error.rule.column_missing.label": "Spalte existiert nicht",
"query_editor.sql_error.rule.column_missing.suggestion": "Prüfe Spaltennamen, Aliasse, Groß-/Kleinschreibung, Tabellenaliase und ob die Spalte zum aktuellen FROM/JOIN-Objekt gehört.",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "Ursprünglicher Fehler: {{error}}",
"query_editor.sql_error.wrapper.semantic_line": "Bedeutung: {{label}}. {{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "Vorschlag: {{suggestion}}",
+ "query_editor.text_to_sql.description": "Beschreiben Sie die Daten, die Sie abfragen oder ändern möchten. GoNavi nutzt die aktuelle Verbindung, Datenbank und geladene Schema-Informationen zum Erzeugen von SQL.",
+ "query_editor.text_to_sql.generate": "SQL erzeugen",
+ "query_editor.text_to_sql.mode.insert": "Am Cursor einfügen",
+ "query_editor.text_to_sql.mode.replace_all": "Alles ersetzen",
+ "query_editor.text_to_sql.mode.replace_selection": "Auswahl ersetzen",
+ "query_editor.text_to_sql.placeholder": "Beispiel: tägliche Bestellsumme der letzten 30 Tage zusammenfassen und nach Datum aufsteigend sortieren",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "Commit",
"query_editor.transaction.action.commit_with_count": "Commit ({{count}})",
"query_editor.transaction.action.rollback": "Rollback",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "Der Verbindungs-Fingerprint konnte nicht analysiert werden",
"query_history.backend.message.cleared": "Verlauf langsamer Abfragen wurde geleert",
"query_history.backend.message.loaded": "Geladen",
- "query.format": "SQL formatieren",
- "query.new": "Neue Abfrage",
- "query.run": "Ausführen",
- "query.save": "Abfrage speichern",
- "query.stop": "Stoppen",
+ "redis.backend.error.address_required": "Redis-Verbindungsadresse darf nicht leer sein",
+ "redis.backend.error.argument_invalid_type": "{{name}} hat einen ungültigen Typ",
+ "redis.backend.error.argument_required": "{{name}} ist erforderlich",
+ "redis.backend.error.cluster_connect_failed": "Redis-Cluster-Verbindung fehlgeschlagen: {{detail}}",
+ "redis.backend.error.command_required": "Command darf nicht leer sein",
+ "redis.backend.error.connect_attempt_failed": "Verbindungsversuch {{attempt}} fehlgeschlagen: {{detail}}",
+ "redis.backend.error.connect_failed": "Redis-Verbindung fehlgeschlagen: {{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "TLS-Einrichtung bei Versuch {{attempt}} fehlgeschlagen: {{detail}}",
+ "redis.backend.error.export_no_keys": "Keine Keys für den Export gefunden",
+ "redis.backend.error.import_no_keys_selected": "Es wurden keine Keys zum Importieren ausgewählt",
+ "redis.backend.error.import_payload_invalid": "Redis-Importdatei ist ungültig: {{detail}}",
+ "redis.backend.error.invalid_node_address": "Ungültige Redis-Knotenadresse: {{address}}",
+ "redis.backend.error.invalid_port": "Ungültiger Redis-Port: {{address}}",
+ "redis.backend.error.node_address_required": "Redis-Knotenadresse darf nicht leer sein",
+ "redis.backend.error.select_db_index_invalid": "Ungültiger Datenbankindex: {{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "Der Datenbankindex muss zwischen {{min}} und {{max}} liegen",
+ "redis.backend.error.select_db_index_required": "Für den SELECT-Befehl ist ein Datenbankindex erforderlich",
+ "redis.backend.error.sentinel_connect_failed": "Redis-Sentinel-Verbindung fehlgeschlagen: {{detail}}",
+ "redis.backend.error.sentinel_master_required": "Der Redis-Sentinel-Modus erfordert einen Master-Namen",
+ "redis.backend.error.ssh_tunnel_create_failed": "SSH-Tunnel konnte nicht erstellt werden: {{detail}}",
+ "redis.backend.error.test_connection_close_failed": "Verbindung erfolgreich, aber das Freigeben der Testverbindung ist fehlgeschlagen: {{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Der Redis-{{topology}}-Modus unterstützt SSH-Tunnel noch nicht. Deaktivieren Sie SSH und versuchen Sie es erneut.",
+ "redis.backend.label.topology_cluster": "Cluster",
+ "redis.backend.label.topology_multi_node": "Multi-Node",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "Hinzufügen erfolgreich",
+ "redis.backend.message.connect_success": "Verbindung erfolgreich",
+ "redis.backend.message.delete_success": "Löschen erfolgreich",
+ "redis.backend.message.export_success": "Export erfolgreich",
+ "redis.backend.message.flush_success": "Leeren erfolgreich",
+ "redis.backend.message.import_success": "Import erfolgreich",
+ "redis.backend.message.rename_success": "Umbenennen erfolgreich",
+ "redis.backend.message.select_db_success": "Datenbank gewechselt",
+ "redis.backend.message.set_success": "Setzen erfolgreich",
+ "redis.db_alias.menu.set": "Alias festlegen",
+ "redis.db_alias.modal.placeholder": "z. B. cache, sessions (leer lassen zum Entfernen)",
+ "redis.db_alias.modal.title": "Alias für {{db}}",
"redis_command.action.clear_console": "Konsole leeren",
"redis_command.action.execute": "Ausführen (Cmd+Enter)",
"redis_command.completion.detail": "Redis-Befehl",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "An das Ende schieben",
"redis_viewer.action.add_member": "Mitglied hinzufügen",
"redis_viewer.action.add_stream_entry": "Eintrag hinzufügen",
+ "redis_viewer.action.change_import_file": "Importdatei wechseln",
"redis_viewer.action.clear_group_selection": "Auswahl aufheben",
"redis_viewer.action.clear_selection": "Auswahl aufheben",
"redis_viewer.action.copy": "Kopieren",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "Bearbeiten",
"redis_viewer.action.export_all": "Alle exportieren",
"redis_viewer.action.export_selected": "Auswahl exportieren",
- "redis_viewer.action.change_import_file": "Importdatei wechseln",
"redis_viewer.action.import": "Importieren",
"redis_viewer.action.load_all": "Alle laden",
"redis_viewer.action.load_more": "Mehr laden",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "Aktualisieren",
"redis_viewer.action.rename_key": "Key umbenennen",
"redis_viewer.action.select_all_import_keys": "Alle Import-Keys auswählen",
- "redis_viewer.action.select_import_file": "Importdatei auswählen",
"redis_viewer.action.select_all_loaded": "Alle geladenen auswählen",
"redis_viewer.action.select_group": "Auswählen",
+ "redis_viewer.action.select_import_file": "Importdatei auswählen",
"redis_viewer.action.set_ttl": "TTL setzen",
"redis_viewer.aria.collapse_group": "Gruppe einklappen",
"redis_viewer.aria.expand_group": "Gruppe ausklappen",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "Binärdaten können nicht bearbeitet werden",
"redis_viewer.hint.switch_auto_to_edit": "Zum Bearbeiten in den Auto-Modus wechseln",
"redis_viewer.label.encoding": "Kodierung: {{encoding}}",
+ "redis_viewer.label.import_database": "Quelldatenbank: db{{database}}",
+ "redis_viewer.label.import_selection": "{{selected}} / {{total}} Keys ausgewählt",
"redis_viewer.label.keys_count": "Geladen: {{count}} Schlüssel",
"redis_viewer.label.length": "Länge: {{count}}",
"redis_viewer.label.node_count": "{{count}} Knoten",
- "redis_viewer.label.import_database": "Quelldatenbank: db{{database}}",
- "redis_viewer.label.import_selection": "{{selected}} / {{total}} Keys ausgewählt",
"redis_viewer.label.original_key": "Ursprünglicher Key: {{key}}",
"redis_viewer.message.add_failed": "Hinzufügen fehlgeschlagen: {{detail}}",
"redis_viewer.message.add_success": "Hinzugefügt",
@@ -6602,9 +6644,9 @@
"redis_viewer.modal.rename_key": "Key umbenennen",
"redis_viewer.modal.set_ttl": "TTL setzen",
"redis_viewer.modal.update_score": "Score aktualisieren",
+ "redis_viewer.notice.large_keyspace_mode": "Leistungsmodus für große Keyspaces ist aktiviert. Die Knotendarstellung ist vereinfacht, und bis zu {{count}} ausgeklappte Gruppen bleiben erhalten.",
"redis_viewer.option.import_overwrite": "Vorhandene Keys überschreiben",
"redis_viewer.option.import_skip_existing": "Vorhandene Keys überspringen",
- "redis_viewer.notice.large_keyspace_mode": "Leistungsmodus für große Keyspaces ist aktiviert. Die Knotendarstellung ist vereinfacht, und bis zu {{count}} ausgeklappte Gruppen bleiben erhalten.",
"redis_viewer.placeholder.key_name": "Key-Name",
"redis_viewer.placeholder.member_value": "Mitgliedswert eingeben",
"redis_viewer.placeholder.new_element_value": "Neuen Elementwert eingeben",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "Rohtext",
"redis_viewer.view.title": "Ansichtsmodus",
- "redis.backend.error.address_required": "Redis-Verbindungsadresse darf nicht leer sein",
- "redis.backend.error.argument_invalid_type": "{{name}} hat einen ungültigen Typ",
- "redis.backend.error.argument_required": "{{name}} ist erforderlich",
- "redis.backend.error.cluster_connect_failed": "Redis-Cluster-Verbindung fehlgeschlagen: {{detail}}",
- "redis.backend.error.command_required": "Command darf nicht leer sein",
- "redis.backend.error.connect_attempt_failed": "Verbindungsversuch {{attempt}} fehlgeschlagen: {{detail}}",
- "redis.backend.error.connect_failed": "Redis-Verbindung fehlgeschlagen: {{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "TLS-Einrichtung bei Versuch {{attempt}} fehlgeschlagen: {{detail}}",
- "redis.backend.error.export_no_keys": "Keine Keys für den Export gefunden",
- "redis.backend.error.import_no_keys_selected": "Es wurden keine Keys zum Importieren ausgewählt",
- "redis.backend.error.import_payload_invalid": "Redis-Importdatei ist ungültig: {{detail}}",
- "redis.backend.error.invalid_node_address": "Ungültige Redis-Knotenadresse: {{address}}",
- "redis.backend.error.invalid_port": "Ungültiger Redis-Port: {{address}}",
- "redis.backend.error.node_address_required": "Redis-Knotenadresse darf nicht leer sein",
- "redis.backend.error.select_db_index_invalid": "Ungültiger Datenbankindex: {{value}}",
- "redis.backend.error.select_db_index_out_of_range": "Der Datenbankindex muss zwischen {{min}} und {{max}} liegen",
- "redis.backend.error.select_db_index_required": "Für den SELECT-Befehl ist ein Datenbankindex erforderlich",
- "redis.backend.error.sentinel_connect_failed": "Redis-Sentinel-Verbindung fehlgeschlagen: {{detail}}",
- "redis.backend.error.sentinel_master_required": "Der Redis-Sentinel-Modus erfordert einen Master-Namen",
- "redis.backend.error.ssh_tunnel_create_failed": "SSH-Tunnel konnte nicht erstellt werden: {{detail}}",
- "redis.backend.error.test_connection_close_failed": "Verbindung erfolgreich, aber das Freigeben der Testverbindung ist fehlgeschlagen: {{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Der Redis-{{topology}}-Modus unterstützt SSH-Tunnel noch nicht. Deaktivieren Sie SSH und versuchen Sie es erneut.",
- "redis.backend.label.topology_cluster": "Cluster",
- "redis.backend.label.topology_multi_node": "Multi-Node",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "Hinzufügen erfolgreich",
- "redis.backend.message.connect_success": "Verbindung erfolgreich",
- "redis.backend.message.delete_success": "Löschen erfolgreich",
- "redis.backend.message.export_success": "Export erfolgreich",
- "redis.backend.message.flush_success": "Leeren erfolgreich",
- "redis.backend.message.import_success": "Import erfolgreich",
- "redis.backend.message.rename_success": "Umbenennen erfolgreich",
- "redis.backend.message.select_db_success": "Datenbank gewechselt",
- "redis.backend.message.set_success": "Setzen erfolgreich",
- "redis.db_alias.menu.set": "Alias festlegen",
- "redis.db_alias.modal.placeholder": "z. B. cache, sessions (leer lassen zum Entfernen)",
- "redis.db_alias.modal.title": "Alias für {{db}}",
"saved_query.default_name": "Abfrage {{index}}",
"saved_query.error.missing_context": "Der gespeicherten Abfrage fehlt SQL-, Verbindungs- oder Datenbankkontext",
"security_update.action.open_ai_settings": "AI-Einstellungen",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "Erstelle 3 häufig genutzte SQL-Abfragen für die Tabelle {{table}}.",
"sidebar.aria.switch_connection": "Zu Verbindung {{name}} wechseln",
"sidebar.badge.recommended": "Empfohlen",
- "sidebar.batch_databases": "Datenbanken stapelweise bearbeiten",
- "sidebar.batch_tables": "Tabellen stapelweise bearbeiten",
"sidebar.batch.filtered_count": "{{filtered}} / {{total}} Objekte angezeigt",
"sidebar.batch.group.tables": "Tabellen",
"sidebar.batch.group.views": "Ansichten",
"sidebar.batch.no_matching_objects": "Keine passenden Objekte",
"sidebar.batch.selected_databases": "{{selected}} / {{total}} Datenbanken ausgewählt",
"sidebar.batch.selected_objects": "{{selected}} / {{total}} Objekte ausgewählt",
+ "sidebar.batch_databases": "Datenbanken stapelweise bearbeiten",
+ "sidebar.batch_tables": "Tabellen stapelweise bearbeiten",
"sidebar.command_search.action.ask_ai.title": "AI fragen",
"sidebar.command_search.action.new_connection.meta": "Eine Datenbank-, Runtime- oder andere Datenquellenverbindung erstellen",
"sidebar.command_search.action.new_connection.title": "Neue Datenquelle",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "Tabellenname",
"sidebar.copy_object_name.label.view": "Ansichtsname",
"sidebar.error.unknown": "Unbekannter Fehler",
+ "sidebar.external_sql.directory_fallback": "SQL-Verzeichnis",
+ "sidebar.external_sql.root": "Externe SQL-Dateien",
"sidebar.external_sql_modal.action.create": "Erstellen",
"sidebar.external_sql_modal.action.rename": "Umbenennen",
"sidebar.external_sql_modal.field.directory_name": "Verzeichnisname",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "Verzeichnisnamen eingeben",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "Der Dateiname darf keine Pfadtrennzeichen enthalten",
"sidebar.external_sql_modal.validation.sql_file_name_required": "SQL-Dateinamen eingeben",
- "sidebar.external_sql.directory_fallback": "SQL-Verzeichnis",
- "sidebar.external_sql.root": "Externe SQL-Dateien",
"sidebar.field.database_name": "Datenbankname",
"sidebar.field.new_database_name": "Neuer Datenbankname",
"sidebar.field.new_table_name": "Neuer Tabellenname",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "Wählen Sie mindestens eine Datenbank aus.",
"sidebar.message.select_host_before_large_sql_file": "Wählen Sie einen Host aus, bevor Sie eine große SQL-Datei ausführen.",
"sidebar.message.select_object_required": "Wählen Sie mindestens ein Objekt aus.",
- "sidebar.message.select_table_required": "Wählen Sie mindestens eine Tabelle aus.",
"sidebar.message.select_sql_directory_failed": "SQL-Verzeichnis konnte nicht ausgewählt werden: {{error}}",
+ "sidebar.message.select_table_required": "Wählen Sie mindestens eine Tabelle aus.",
"sidebar.message.sidebar_filter_reset": "Seitenleistenfilter zurückgesetzt.",
"sidebar.message.sidebar_filter_sync_disabled": "Synchronisierung des linken Filters deaktiviert.",
"sidebar.message.sidebar_filter_sync_enabled": "Synchronisierung des linken Filters aktiviert.",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "Stapeloperationen für Objekte",
"sidebar.modal.confirm_clear_selected_tables.content": "Daten der ausgewählten Objekte unter {{connection}} / {{database}} leeren? Dies kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_clear_selected_tables.title": "Ausgewählte Tabellen leeren",
- "sidebar.modal.confirm_delete_selected_databases.content": "{{count}} ausgewählte Datenbanken unter {{connection}} löschen? Dies kann nicht rückgängig gemacht werden.",
- "sidebar.modal.confirm_delete_selected_databases.title": "Ausgewählte Datenbanken löschen",
- "sidebar.modal.confirm_delete_selected_tables.content": "{{count}} ausgewählte Tabellen unter {{connection}} / {{database}} löschen? Dies kann nicht rückgängig gemacht werden.",
- "sidebar.modal.confirm_delete_selected_tables.title": "Ausgewählte Tabellen löschen",
+ "sidebar.modal.confirm_delete.title": "Löschen bestätigen",
"sidebar.modal.confirm_delete_connection.content": "{{name}} löschen?",
"sidebar.modal.confirm_delete_database.content": "{{name}} löschen? Dies kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_delete_database.title": "Datenbank löschen",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "Gespeicherte Abfrage \"{{name}}\" löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_delete_schema.content": "schema {{name}} löschen? Das schema und alle enthaltenen Objekte werden gelöscht. Dies kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_delete_schema.title": "schema löschen",
+ "sidebar.modal.confirm_delete_selected_databases.content": "{{count}} ausgewählte Datenbanken unter {{connection}} löschen? Dies kann nicht rückgängig gemacht werden.",
+ "sidebar.modal.confirm_delete_selected_databases.title": "Ausgewählte Datenbanken löschen",
+ "sidebar.modal.confirm_delete_selected_tables.content": "{{count}} ausgewählte Tabellen unter {{connection}} / {{database}} löschen? Dies kann nicht rückgängig gemacht werden.",
+ "sidebar.modal.confirm_delete_selected_tables.title": "Ausgewählte Tabellen löschen",
"sidebar.modal.confirm_delete_sql_directory.content": "\"{{name}}\" löschen? Dadurch wird das lokale Verzeichnis vom Datenträger gelöscht; es können nur leere Verzeichnisse gelöscht werden.",
"sidebar.modal.confirm_delete_sql_directory.title": "SQL-Verzeichnis löschen",
"sidebar.modal.confirm_delete_sql_file.content": "\"{{name}}\" löschen? Dadurch wird die lokale Datei vom Datenträger gelöscht und kann nicht wiederhergestellt werden.",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "Gruppe \"{{name}}\" löschen? Die enthaltenen Verbindungen werden nicht gelöscht.",
"sidebar.modal.confirm_delete_view.content": "{{name}} löschen? Dies kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_delete_view.title": "Ansicht löschen",
- "sidebar.modal.confirm_delete.title": "Löschen bestätigen",
"sidebar.modal.confirm_table_data_action.content": "{{action}} für {{table}} ausführen? Dies kann nicht rückgängig gemacht werden.",
"sidebar.modal.confirm_table_data_action.title": "{{action}} bestätigen",
"sidebar.modal.create_database.title": "Datenbank erstellen",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "Gruppe erstellen",
"sidebar.modal.tag.edit_description": "Gruppenname und enthaltene Verbindungen aktualisieren.",
"sidebar.modal.tag.edit_title": "Gruppe bearbeiten",
+ "sidebar.object.function": "Funktion",
+ "sidebar.object.procedure": "Prozedur",
+ "sidebar.object.view": "Ansicht",
"sidebar.object_group.events": "Ereignisse",
"sidebar.object_group.materialized_views": "Materialisierte Ansichten",
"sidebar.object_group.packages": "Pakete",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "Tabellen",
"sidebar.object_group.triggers": "Trigger",
"sidebar.object_group.views": "Ansichten",
- "sidebar.object.function": "Funktion",
- "sidebar.object.procedure": "Prozedur",
- "sidebar.object.view": "Ansicht",
"sidebar.placeholder.filter_table_view": "Tabellen und Ansichten filtern",
"sidebar.placeholder.select_connection": "Verbindung auswählen",
"sidebar.placeholder.select_connection_first": "Zuerst eine Verbindung auswählen",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "Manueller Bereich",
"sidebar.search.multi_select_supported": "Mehrere Bereiche unterstützt",
"sidebar.search.placeholder": "Suchen...",
- "sidebar.search.scope_description": "Wählen Sie, wo die Suche in der Seitenleiste Treffer finden soll.",
- "sidebar.search.scope_hint": "Im intelligenten Modus werden je nach Kontext Namen, Hosts, Datenbanken und Objekte durchsucht.",
- "sidebar.search.scope_title": "Suchbereich",
- "sidebar.search.scope_tooltip": "Aktueller Suchbereich: {{scope}}",
"sidebar.search.scope.database": "Datenbank",
"sidebar.search.scope.host": "Rechner",
"sidebar.search.scope.object": "Objekt",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "Grenzt die Suche anhand des ausgewählten Knotens automatisch ein.",
"sidebar.search.scope.smart_short": "Intelligent",
"sidebar.search.scope.tag": "Markierung",
+ "sidebar.search.scope_description": "Wählen Sie, wo die Suche in der Seitenleiste Treffer finden soll.",
+ "sidebar.search.scope_hint": "Im intelligenten Modus werden je nach Kontext Namen, Hosts, Datenbanken und Objekte durchsucht.",
+ "sidebar.search.scope_title": "Suchbereich",
+ "sidebar.search.scope_tooltip": "Aktueller Suchbereich: {{scope}}",
"sidebar.sql_directory.default_name": "SQL-Verzeichnis",
+ "sidebar.sql_file.default_name": "SQL-Datei",
"sidebar.sql_file_exec.cancel": "Ausführung abbrechen",
"sidebar.sql_file_exec.executed_label": "Ausgeführt: ",
"sidebar.sql_file_exec.file_size": "Dateigröße: ",
+ "sidebar.sql_file_exec.message.already_running": "Eine externe SQL-Ausführung läuft bereits",
"sidebar.sql_file_exec.rows_separator": " Zeilen | Fehlgeschlagen: ",
"sidebar.sql_file_exec.rows_suffix": " Zeilen",
- "sidebar.sql_file_exec.status_label": "Status: ",
"sidebar.sql_file_exec.status.cancelled": "Abgebrochen",
"sidebar.sql_file_exec.status.done": "Abgeschlossen",
"sidebar.sql_file_exec.status.error": "Fehler",
"sidebar.sql_file_exec.status.running": "Wird ausgeführt",
+ "sidebar.sql_file_exec.status_label": "Status: ",
"sidebar.sql_file_exec.title": "Externe SQL-Datei ausführen",
- "sidebar.sql_file_exec.message.already_running": "Eine externe SQL-Ausführung läuft bereits",
"sidebar.sql_file_exec.workbench.action.clear_history": "Verlauf leeren",
"sidebar.sql_file_exec.workbench.action.run_again": "Erneut ausführen",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "Zurzeit läuft keine Ausführung. Nach der Dateiauswahl bleibt der Fortschritt hier sichtbar.",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "Gestartet um",
"sidebar.sql_file_exec.workbench.section.config": "Ausführungskonfiguration",
"sidebar.sql_file_exec.workbench.stage.preparing": "Ausführung wird vorbereitet",
- "sidebar.sql_file.default_name": "SQL-Datei",
"sidebar.sql_template.duckdb_macro_hint": "Verwenden Sie SQL Macro für funktionsähnliches Verhalten",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB unterstützt gespeicherte Prozeduren noch nicht",
"sidebar.sql_template.edit_routine": "{{type}} {{name}} bearbeiten",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "Tabellenstrukturen des aktuellen Schemas exportieren · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · Schema-Aktionen",
"sidebar.v2_table_group_menu.current_database": "Aktuelle Datenbank",
- "sidebar.v2_table_group_menu.display_section": "Anzeige",
"sidebar.v2_table_group_menu.display_create_time": "Erstellungszeit anzeigen",
+ "sidebar.v2_table_group_menu.display_section": "Anzeige",
"sidebar.v2_table_group_menu.display_table_rows": "Zeilenzahl anzeigen",
"sidebar.v2_table_group_menu.display_table_size": "Tabellengröße anzeigen",
"sidebar.v2_table_group_menu.display_update_time": "Änderungszeit anzeigen",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "Die Diagnose unterstuetzt nur SELECT- / WITH-Abfragen. Fuer Schreiboperationen verwenden Sie bitte den EXPLAIN-PLAN-Modus (PR2-Unterstuetzung).",
"sql_analysis.backend.error.unsupported_db_type": "Die aktuelle Datenquelle ({{dbType}}) unterstuetzt noch keine SQL-Diagnose. In Phase 1 werden MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase unterstuetzt.",
"sql_analysis.backend.message.completed": "Diagnose abgeschlossen",
- "sql_analysis.explain_graph.flag.filesort": "Zusatzsortierung",
- "sql_analysis.explain_graph.flag.full_scan": "Vollscan",
- "sql_analysis.explain_graph.flag.temp_table": "Temporäre Tabelle",
- "sql_analysis.explain_graph.label.index": "Index: ",
- "sql_analysis.explain_graph.label.table": "Tabelle: ",
- "sql_analysis.explain_graph.metric.actual_rows": "Tatsaechlich",
- "sql_analysis.explain_graph.metric.cost": "Kosten",
- "sql_analysis.explain_graph.metric.est_rows": "Geschaetzt",
"sql_analysis.explain.empty": "SQL eingeben und Diagnose ausfuehren",
"sql_analysis.explain.error.query_required": "Die Abfrage ist leer",
"sql_analysis.explain.error.run_failed": "Diagnose fehlgeschlagen",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(kein Rohtext)",
"sql_analysis.explain.view.plan": "Ausfuehrungsplan",
"sql_analysis.explain.view.raw": "Rohtext",
+ "sql_analysis.explain_graph.flag.filesort": "Zusatzsortierung",
+ "sql_analysis.explain_graph.flag.full_scan": "Vollscan",
+ "sql_analysis.explain_graph.flag.temp_table": "Temporäre Tabelle",
+ "sql_analysis.explain_graph.label.index": "Index: ",
+ "sql_analysis.explain_graph.label.table": "Tabelle: ",
+ "sql_analysis.explain_graph.metric.actual_rows": "Tatsaechlich",
+ "sql_analysis.explain_graph.metric.cost": "Kosten",
+ "sql_analysis.explain_graph.metric.est_rows": "Geschaetzt",
"sql_analysis.sidebar.node.actual_rows": "Tatsaechliche Zeilen",
"sql_analysis.sidebar.node.buffer_hit": "Buffer-Treffer",
"sql_analysis.sidebar.node.cost": "Kosten",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "Tag {{index}}",
"store.fallback.sql_snippet_name": "Snippet {{index}}",
"tab_manager.close_aria": "{{title}} schließen",
+ "tab_manager.detached.close": "Fenster schließen",
+ "tab_manager.detached.restore": "Als Tab wiederherstellen",
+ "tab_manager.detached.title_fallback": "Schwebendes Fenster",
"tab_manager.empty.action.open_ai": "AI öffnen",
"tab_manager.empty.aria.start_workbench": "GoNavi-Startarbeitsbereich",
"tab_manager.empty.eyebrow.connections": "{{count}} Verbindungen",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "Tabs links schließen",
"tab_manager.menu.close_other": "Andere Tabs schließen",
"tab_manager.menu.close_right": "Tabs rechts schließen",
+ "tab_manager.menu.open_in_window": "In schwebendem Fenster öffnen",
+ "tab_manager.menu.restore_to_tab": "Als Tab wiederherstellen",
"tab_manager.menu.tab_display_settings": "Tab-Einstellungen",
"tab_manager.sql_file_close.close_tabs": "Tabs schließen",
"tab_manager.sql_file_close.continue_close": "Schließen fortsetzen",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "Die Initialisierungsdaten sind abgelaufen. Laden Sie die Seite neu und versuchen Sie es erneut.",
"web_auth.error.setup_required": "Die Einrichtung der Web-Authentifizierung ist erforderlich",
"web_auth.error.setup_token_expired": "Das Initialisierungstoken ist abgelaufen. Laden Sie die Seite neu und versuchen Sie es erneut.",
- "web_auth.error.totp_code_required": "Geben Sie einen Google-Authenticator-Code oder Wiederherstellungscode ein",
"web_auth.error.too_many_login_attempts": "Zu viele fehlgeschlagene Anmeldungen. Bitte später erneut versuchen.",
+ "web_auth.error.totp_code_required": "Geben Sie einen Google-Authenticator-Code oder Wiederherstellungscode ein",
"web_auth.page.login.code_label": "Google-Authenticator-Code / Wiederherstellungscode",
"web_auth.page.login.code_placeholder": "6-stelliger Code oder Wiederherstellungscode",
"web_auth.page.login.description": "Die Browser-Version verwendet serverseitige Sitzungen. Leerlaufzeit, absolute Ablaufzeit und Merkdauer werden zentral vom Server gesteuert.",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "Wiederherstellungscodes werden nur dieses eine Mal angezeigt. Bitte offline speichern:",
"web_auth.page.setup.remember_label": "Anmeldung merken (Tage)",
"web_auth.page.setup.secret_label": "Secret",
+ "web_auth.page.setup.session_title": "Sitzungsrichtlinie",
"web_auth.page.setup.step_admin_description": "Zuerst das Browser-Admin-Kennwort anlegen",
"web_auth.page.setup.step_admin_hint": "Legen Sie zuerst das Admin-Passwort fest und entscheiden Sie dann, ob Google Authenticator 2FA sofort aktiviert werden soll.",
"web_auth.page.setup.step_admin_title": "Admin-Passwort erstellen",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "TOTP per QR-Code oder manuell binden",
"web_auth.page.setup.step_totp_hint": "Wenn 2FA aktiviert ist, verbinden Sie hier die Authenticator-App und bestätigen Sie die Einrichtung mit dem ersten Code.",
"web_auth.page.setup.step_totp_title": "Authenticator verbinden",
- "web_auth.page.setup.session_title": "Sitzungsrichtlinie",
"web_auth.page.setup.submit": "Einrichtung abschließen und GoNavi öffnen",
"web_auth.page.setup.subtitle": "Beim ersten Start das Admin-Passwort erstellen und Google Authenticator sofort verknüpfen",
"web_auth.page.setup.title": "GoNavi Web initialisieren",
diff --git a/shared/i18n/en-US.json b/shared/i18n/en-US.json
index c2513437..fb7c949a 100644
--- a/shared/i18n/en-US.json
+++ b/shared/i18n/en-US.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "Failed to create Claude Code configuration directory: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code configuration format is invalid: {{path}} should be {{expected}}",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "Failed to parse Claude Code configuration: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "Failed to locate Claude Code configuration: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "Failed to read Claude Code configuration: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "Failed to serialize Claude Code configuration: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "Failed to write Claude Code configuration: {{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "Claude Code user-level MCP configuration has been written. Restart Claude CLI, then GoNavi will appear under User MCPs in /mcp.",
+ "ai.service.mcp_client.claude_code.status.connected": "Claude Code user-level GoNavi MCP configuration was detected and matches the current GoNavi installation path",
+ "ai.service.mcp_client.claude_code.status.missing": "No Claude Code user-level GoNavi MCP configuration was detected",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "A GoNavi MCP record was detected in Claude Code, but the current GoNavi installation path check failed: {{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "A GoNavi MCP record was detected in Claude Code, but it does not match the current GoNavi installation path. Updating is recommended.",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "Failed to create Codex configuration directory: {{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Codex configuration format is invalid: {{path}} could not be parsed as {{expected}}",
+ "ai.service.mcp_client.codex.config_path_failed": "Failed to locate Codex configuration: {{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "Failed to read Codex configuration: {{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "Failed to write Codex configuration: {{detail}}",
+ "ai.service.mcp_client.codex.install_success": "Codex user-level MCP configuration has been written. Restart Codex CLI or the desktop app to see GoNavi.",
+ "ai.service.mcp_client.codex.status.connected": "Codex user-level GoNavi MCP configuration was detected and matches the current GoNavi installation path",
+ "ai.service.mcp_client.codex.status.missing": "No Codex user-level GoNavi MCP configuration was detected",
+ "ai.service.mcp_client.codex.status.path_check_failed": "A GoNavi MCP record was detected in Codex, but the current GoNavi installation path check failed: {{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "A GoNavi MCP record was detected in Codex, but it does not match the current GoNavi installation path. Updating is recommended.",
+ "ai.service.mcp_client.executable_path_empty": "Current GoNavi executable path is empty",
+ "ai.service.mcp_client.executable_path_failed": "Failed to locate the current GoNavi executable: {{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} usually runs in the cloud or a remote environment. Connect it to Windows GoNavi through a remote MCP bridge; database passwords remain on this GoNavi machine.",
+ "ai.service.mcp_client.user_home_dir_unavailable": "Unable to determine the current user home directory",
"ai_chat.builtin_tools.database.execute_sql.desc": "Execute a SQL query and return results",
"ai_chat.builtin_tools.database.execute_sql.detail": "Pass connectionId, dbName, and sql, then execute SQL on the target database and return results (up to 50 rows). Controlled by safety level; read-only mode only allows SELECT/SHOW/DESCRIBE.",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "Connection ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "New chat",
"ai_chat.header.export_time": "Exported at:",
"ai_chat.header.export_user": "You",
- "ai_chat.header.mode_tabs.aria_label": "AI work mode",
"ai_chat.header.mode.chat": "Chat",
"ai_chat.header.mode.history": "History",
"ai_chat.header.mode.insights": "Auto insights",
+ "ai_chat.header.mode_tabs.aria_label": "AI work mode",
"ai_chat.header.session.connected": "{{title}} · Connected",
"ai_chat.header.tooltip.close": "Close panel",
"ai_chat.header.tooltip.export_markdown": "Export as Markdown",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "Match messageId and contentPreview against the current conversation to identify which bubble triggered the render error.",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "If more narrowing is needed, compare the latest user input, tool results, and related component code.",
"ai_chat.inspection.last_render_error.recorded_summary": "A recent AI message render error was recorded, including the message, render path, and stack summary needed for diagnosis.",
+ "ai_chat.inspection.mcp.message.configured": "{{serverCount}} MCP server is configured; {{enabledCount}} enabled",
+ "ai_chat.inspection.mcp.message.empty": "No MCP servers are configured yet",
+ "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} MCP server is configured; {{enabledCount}} enabled; {{issueCount}} configuration checks need attention",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "Fix the MCP server configuration errors first, then test the server again",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Open the affected MCP server and split launch command, arguments, and timeout according to the configuration check hints",
+ "ai_chat.inspection.mcp.warning.config_errors": "{{count}} MCP server has launch configuration errors; testing and tool discovery may fail",
+ "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} MCP server has launch configuration warnings; confirm them before diagnosing tool discovery failures",
"ai_chat.inspection.mcp_docker.message.empty": "No Docker MCP servers are configured",
"ai_chat.inspection.mcp_docker.message.with_enabled": "There are {{total}} Docker MCP servers; {{enabled}} are enabled",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "There are {{total}} Docker MCP servers; {{count}} have incomplete key arguments",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "Some MCP tools do not declare inputSchema, so parameter documentation may be incomplete.",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "No matching MCP tool was found.",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "No MCP tools were discovered; MCP services may not be configured, or service testing/discovery may have failed.",
- "ai_chat.inspection.mcp.message.configured": "{{serverCount}} MCP server is configured; {{enabledCount}} enabled",
- "ai_chat.inspection.mcp.message.empty": "No MCP servers are configured yet",
- "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} MCP server is configured; {{enabledCount}} enabled; {{issueCount}} configuration checks need attention",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "Fix the MCP server configuration errors first, then test the server again",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Open the affected MCP server and split launch command, arguments, and timeout according to the configuration check hints",
- "ai_chat.inspection.mcp.warning.config_errors": "{{count}} MCP server has launch configuration errors; testing and tool discovery may fail",
- "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} MCP server has launch configuration warnings; confirm them before diagnosing tool discovery failures",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "Check whether exception or cancellation paths left empty assistant placeholder messages.",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "Check whether streaming append logic reuses the same assistantMsgId instead of creating a new assistant message for the same reply.",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "Check whether useAIChatLocalTools writes a tool message for every tool_call_id.",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "Returns whether the current chat input has all prerequisites to send, including active provider, missing key or endpoint on the current provider, selected model, current connection context, attached table context, and next actions. Use it when users ask why sending is disabled or what the chat input is missing.",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "No parameters",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "Read the send-prerequisite state of the current AI chat input, including active provider, key and endpoint completeness, selected model, current connection context, attached table schema count, and suggested next actions.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "Diagnose AI context size and stability risk",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "Estimates recent messages, tool results, attached table DDL, MCP tool schemas, user prompts, and Skills in the current or specified AI session, then returns low/medium/high/critical risk, main expansion sources, and narrowing suggestions. Use it when AI slows down, answers erratically, context is too large, tool results are long, or too many table schemas are attached.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "Optional. Whether to return largest message, largest DDL table, and largest MCP schema details. Default true.",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "Optional. AI session ID to diagnose. If omitted, the current active session is used.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(default current session), messageLimit?(default 40), includeDetails?(default true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "Read an AI context-size and stability-risk snapshot, including recent message window, tool result length, attached table DDL, MCP tool schemas, user prompts, and enabled Skills, then return risk level, warnings, and narrowing suggestions.",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "Inspect current AI prompts and Skills configuration",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "Returns current user-defined global, database, and JVM prompts, plus enabled Skills, scopes, dependency tools, and skill prompt content. Use it when users ask which prompts are currently attached, why AI answers this way, or which Skills are active.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "No parameters",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "External tool connection status: not connected",
"ai_chat.mcp_client.install.state.remote": "External tool connection status: remote MCP bridge required",
"ai_chat.mcp_client.install.state.stale": "External tool connection status: old config found, update needed",
- "ai_chat.mcp_client.install.status_tone.connected": "Connected",
- "ai_chat.mcp_client.install.status_tone.not_connected": "Not connected",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "Remote bridge",
- "ai_chat.mcp_client.install.status_tone.status_error": "Status error",
- "ai_chat.mcp_client.install.status_tone.update_required": "Update needed",
- "ai_chat.mcp_client.install.status.cli_prefix": "CLI detection: {{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "Detected {{command}}",
"ai_chat.mcp_client.install.status.cli.not_detected": "{{command}} was not detected; config can still be written first",
"ai_chat.mcp_client.install.status.cli.remote": "Remote Agent does not need local {{command}} command detection",
+ "ai_chat.mcp_client.install.status.cli_prefix": "CLI detection: {{status}}",
"ai_chat.mcp_client.install.status.command_path": "Command path: {{path}}",
"ai_chat.mcp_client.install.status.config_file": "Config file: {{path}}",
"ai_chat.mcp_client.install.status.copy_command": "Copy launch command",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "Refresh status",
"ai_chat.mcp_client.install.status.remote_boundary": "Remote connection boundary: database connection info and passwords stay in Windows GoNavi. Cloud Agents read connection summaries, object lists, tables, views, and DDL through schema-only MCP tools by default, and execute_sql is not registered. For cross-machine access, use GoNavi Streamable HTTP mode with a token, tunnel, or reverse proxy.",
"ai_chat.mcp_client.install.status.title": "Selected client status",
+ "ai_chat.mcp_client.install.status_tone.connected": "Connected",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "Not connected",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "Remote bridge",
+ "ai_chat.mcp_client.install.status_tone.status_error": "Status error",
+ "ai_chat.mcp_client.install.status_tone.update_required": "Update needed",
"ai_chat.mcp_client.install.summary.connected": "{{label}} is connected to this GoNavi MCP and can call it directly.",
"ai_chat.mcp_client.install.summary.error": "Failed to read the connection status for {{label}}. Refresh detection first.",
"ai_chat.mcp_client.install.summary.missing": "This GoNavi MCP is not connected to {{label}} yet.",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "Read database object list",
"ai_chat.message.tool_call.get_table_ddl": "Read CREATE TABLE statement",
"ai_chat.message.tool_call.get_tables": "Analyze table structure info",
- "ai_chat.message.tool_call.get_views": "Analyze view structure info",
"ai_chat.message.tool_call.get_triggers": "Inspect trigger logic",
+ "ai_chat.message.tool_call.get_views": "Analyze view structure info",
"ai_chat.message.tool_call.inspect_active_tab": "Read current active tab",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "Read current AI chat preflight status",
"ai_chat.message.tool_call.inspect_ai_context_budget": "Diagnose AI context budget risk",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "allowed",
"ai_chat.system.context.permission.denied": "denied",
"ai_chat.system.context.skill_prompt": "The active Skill \"{{skillName}}\" ({{skillDescription}}) applies to this response. Follow its constraints and workflow:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "The active Skill \"{{skillName}}\" applies to this response. Follow its constraints and workflow:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\nRequired tools: {{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "The active Skill \"{{skillName}}\" applies to this response. Follow its constraints and workflow:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "When the user asks why sending is unavailable, what configuration AI chat is missing, or whether the input area is ready, call inspect_ai_chat_readiness first to read the real pre-send state instead of judging from UI state alone.",
"ai_chat.system.inspection_guidance.inspect_ai_context": "When the user asks about the current AI context, associated tables, or attached table schemas, call inspect_ai_context first to read the mounted table-schema context instead of repeating from memory.",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "When the user mentions slow AI, oversized context, too many table schemas, long tool results, unreliable answers, or needs context sizing before a complex task, call inspect_ai_context_budget first to read the size risks.",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "Enter a valid endpoint URL",
"ai_settings.form.api_format": "API format",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "Leave blank to use the signed-in CodeBuddy CLI account on this machine; if filled, the current credential overrides it.",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (optional)",
"ai_settings.form.api_key_keep_placeholder": "Leave blank to keep using the saved secret",
"ai_settings.form.api_key_placeholder": "sk-... / your API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "Leave blank to use the local sign-in, or enter API Key / Token to override",
"ai_settings.form.api_key_required": "Enter an API Key",
"ai_settings.form.api_key_saved_hint": "An API Key is already saved. Leave blank to keep it, or enter a new value to replace it.",
- "ai_settings.form.api_key.codebuddy_hint": "Leave blank to use the signed-in CodeBuddy CLI account on this machine; if filled, the current credential overrides it.",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (optional)",
"ai_settings.form.clear_saved_api_key": "Clear saved API Key",
+ "ai_settings.form.inline_completion_model": "Auto-completion model",
+ "ai_settings.form.inline_completion_model_hint": "Choose a smaller, faster model for SQL editor ghost completions. Leave blank to follow the chat model.",
+ "ai_settings.form.inline_completion_model_placeholder": "Follow chat model",
"ai_settings.form.model_list": "Available model list (optional)",
"ai_settings.form.model_list_placeholder": "Configure model IDs; leave blank to fetch them from the server",
"ai_settings.form.model_list_placeholder.codebuddy": "Optional: prefill common models; leave blank to let CodeBuddy CLI or the service choose automatically",
"ai_settings.form.model_list_placeholder.cursor": "Optional: prefill common Cursor model IDs; leave blank to use Cursor's default model automatically",
- "ai_settings.form.inline_completion_model": "Auto-completion model",
- "ai_settings.form.inline_completion_model_hint": "Choose a smaller, faster model for SQL editor ghost completions. Leave blank to follow the chat model.",
- "ai_settings.form.inline_completion_model_placeholder": "Follow chat model",
"ai_settings.form.provider_name": "Provider name",
"ai_settings.form.provider_name_placeholder": "Example: My OpenAI-compatible endpoint / private model",
"ai_settings.form.provider_name_required": "Enter a name",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "GoNavi MCP HTTP server is not running",
"ai_settings.mcp_server.argument_hints.action_separator": "; ",
"ai_settings.mcp_server.argument_hints.argument_details": "Argument details",
- "ai_settings.mcp_server.argument_hints.business_arguments": "Detected business arguments",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "Pass authentication data only when the README requires a command argument; prefer environment variables.",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "Access Token",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "Use the real value locally; do not paste it into chat or screenshots.",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "Specifies a service address or API entry point needed by the MCP service.",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "Base URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "Enter the full address without embedding secrets in the URL.",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Points to a local file, directory, repository, or executable used by the MCP service.",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "Config file",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Use an absolute local path and grant the smallest necessary scope.",
"ai_settings.mcp_server.argument_hints.business.config.detail": "Points to a local file, directory, repository, or executable used by the MCP service.",
"ai_settings.mcp_server.argument_hints.business.config.label": "Config file",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "Use an absolute local path and grant the smallest necessary scope.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Points to a local file, directory, repository, or executable used by the MCP service.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "Config file",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Use an absolute local path and grant the smallest necessary scope.",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "Points to a local file, directory, repository, or executable used by the MCP service.",
"ai_settings.mcp_server.argument_hints.business.dir.label": "Directory",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "Use an absolute local path and grant the smallest necessary scope.",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "Points to a local file, directory, repository, or executable used by the MCP service.",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "Workspace directory",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "Use an absolute local path and grant the smallest necessary scope.",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "Detected business arguments",
"ai_settings.mcp_server.argument_hints.category.endpoint": "Endpoint",
"ai_settings.mcp_server.argument_hints.category.generic": "Business",
"ai_settings.mcp_server.argument_hints.category.mode": "Mode",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "Detected {{envVarCount}} variables; {{secretLikeCount}} look like secrets. Only the key purpose and risk are explained here; values are not shown.",
"ai_settings.mcp_server.env_hints.title": "Environment variable usage hints",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "Expected: ",
- "ai_settings.mcp_server.env_hints.warning_prefix": "Warning: {{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "When command=docker, these environment variables are passed only to the docker CLI and do not automatically enter the container.",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} environment variable values are empty and must be filled or removed before testing.",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} environment variables still look like example placeholder values.",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "Warning: {{warnings}}",
"ai_settings.mcp_server.form.action.delete": "Delete",
"ai_settings.mcp_server.form.action.delete_cancel": "Cancel",
"ai_settings.mcp_server.form.action.delete_confirm": "Delete this MCP service?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "Disabled",
"ai_settings.mcp_server.form.enabled.option.enabled": "Enabled",
"ai_settings.mcp_server.form.enabled.title": "Enabled",
- "ai_settings.mcp_server.form.env_status.empty": "Each line must be KEY=VALUE; lines without an equals sign or with spaces in the key will not be saved.",
- "ai_settings.mcp_server.form.env_status.invalid": "Detected {{validCount}} environment variable(s), plus {{invalidCount}} invalid line(s) that will not be saved this time: {{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "Detected {{count}} environment variable(s).",
"ai_settings.mcp_server.form.env.description": "Use one KEY=VALUE per line, usually for API Key, working directory, service URL, and similar configuration. Leave it empty if not needed. These values are saved to local configuration and passed as environment variables when starting the MCP process; do not write export, and do not put secrets into chat content.",
"ai_settings.mcp_server.form.env.placeholder": "Environment variables, one KEY=VALUE per line, for example:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "Environment variables",
+ "ai_settings.mcp_server.form.env_status.empty": "Each line must be KEY=VALUE; lines without an equals sign or with spaces in the key will not be saved.",
+ "ai_settings.mcp_server.form.env_status.invalid": "Detected {{validCount}} environment variable(s), plus {{invalidCount}} invalid line(s) that will not be saved this time: {{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "Detected {{count}} environment variable(s).",
"ai_settings.mcp_server.form.instructions.save_description": "writes this MCP into local configuration for long-term use.",
"ai_settings.mcp_server.form.instructions.save_title": "Save",
"ai_settings.mcp_server.form.instructions.test_description": "starts once with the current fields, checks which tools can be discovered, and does not save the configuration.",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "Transport",
"ai_settings.mcp_server.guide.examples.description": "Put only the executable itself in the startup command. Do not mix arguments into it. Common forms:",
"ai_settings.mcp_server.guide.examples.title": "Examples",
- "ai_settings.mcp_server.guide.field_lookup.description": "If you do not know what to put in a parameter field, start here. Each field below also has more specific examples and cautions.",
- "ai_settings.mcp_server.guide.field_lookup.title": "Field quick reference",
"ai_settings.mcp_server.guide.field.args.avoid": "Do not enter npx/node/uvx/python/docker again, and do not paste multiple arguments into one long string.",
"ai_settings.mcp_server.guide.field.args.detail": "For npx -y pkg --stdio, split it into -y, pkg, and --stdio. For docker run --rm -i image, split it into run, --rm, -i, and image.",
"ai_settings.mcp_server.guide.field.args.fill": "Enter -y, package name, script name, -m, --stdio, run, --rm, -i, image name, and similar arguments one by one.",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "Keep stdio.",
"ai_settings.mcp_server.guide.field.transport.summary": "How GoNavi communicates with this MCP Server.",
"ai_settings.mcp_server.guide.field.transport.title": "Transport",
+ "ai_settings.mcp_server.guide.field_lookup.description": "If you do not know what to put in a parameter field, start here. Each field below also has more specific examples and cautions.",
+ "ai_settings.mcp_server.guide.field_lookup.title": "Field quick reference",
"ai_settings.mcp_server.guide.full_command.apply": "Auto-split into the fields below",
"ai_settings.mcp_server.guide.full_command.description": "Paste the full command directly. GoNavi will split it into startup command / command arguments / environment variables. It supports Unix KEY=VALUE, Windows PowerShell $env:KEY=VALUE;, and cmd set KEY=VALUE && prefixes.",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "Will parse as: command {{command}}, {{argsCount}} argument(s), {{envCount}} environment variable(s).",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "Example: ",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "Fill: ",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "Recommended access method:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Current boundary:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "The built-in local GoNavi MCP entry is stdio, suitable for clients such as Claude Code / Codex running on the same machine as GoNavi.",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "If OpenClaw/Hermans runs on cloud Linux, it cannot use the Windows local stdio command directly; start GoNavi Streamable HTTP mode on Windows, then let the cloud Agent call it through a tunnel or reverse proxy.",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Current boundary:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "No GUI / CLI config generation command:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "Copyable config snippet (for Agents that support mcpServers JSON):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "Current hint: {{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "Or set environment variable GONAVI_MCP_HTTP_TOKEN=, then run {{standaloneCommand}}",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "If remote SQL execution is explicitly required, remove --schema-only; execute_sql remains constrained by GoNavi AI safety controls, and writes must explicitly pass allowMutating=true.",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Goal:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "Database connections, accounts, and passwords stay in Windows GoNavi. The cloud Agent does not need to store database passwords.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "Remote access uses schema-only mode by default and does not register execute_sql, suitable for giving OpenClaw/Hermans schema-structure access only.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "The cloud Agent only reads get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl results through MCP tools.",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Goal:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "CLI / service launch command:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. Add a remote MCP Server in {{displayName}}, choose Streamable HTTP transport, set the URL to the tunneled/reverse-proxied /mcp address, and set Authorization: Bearer .",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. Call get_connections first to obtain connectionId, then call schema tools; do not write database host/user/password into the cloud Agent config.",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "Database session extra prompt",
"ai_settings.prompts.field.global.description": "Applies to all AI sessions, such as \"state the conclusion first\" or \"keep answers concise\".",
"ai_settings.prompts.field.global.title": "Global extra prompt",
- "ai_settings.prompts.field.jvm_diagnostic.description": "Applies only to the JVM diagnostics workspace, such as \"give the plan before commands\".",
- "ai_settings.prompts.field.jvm_diagnostic.title": "JVM diagnostics extra prompt",
"ai_settings.prompts.field.jvm.description": "Applies only to JVM resource browsing and analysis scenarios.",
"ai_settings.prompts.field.jvm.title": "JVM resource analysis extra prompt",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "Applies only to the JVM diagnostics workspace, such as \"give the plan before commands\".",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "JVM diagnostics extra prompt",
"ai_settings.prompts.message.save_failed": "Failed to save custom prompts",
"ai_settings.prompts.message.saved": "Custom prompts saved",
"ai_settings.prompts.placeholder.empty": "Leave empty to add nothing extra",
"ai_settings.prompts.user.description": "This content is appended as a system message after the built-in system prompts. Use it for personal style preferences, output constraints, or team rules. System rules still take precedence for safety boundaries.",
"ai_settings.prompts.user.title": "User-level custom prompts",
+ "ai_settings.provider.action.add": "Add model provider",
+ "ai_settings.provider.action.delete": "Delete",
+ "ai_settings.provider.action.edit": "Edit",
+ "ai_settings.provider.auto_model": "Auto-selected",
+ "ai_settings.provider.confirm_delete": "Delete this provider?",
+ "ai_settings.provider.editor.add_title": "Add model provider",
+ "ai_settings.provider.editor.edit_title": "Edit model provider",
+ "ai_settings.provider.empty.description": "Add one to start using the AI assistant",
+ "ai_settings.provider.empty.title": "No model provider configured",
+ "ai_settings.provider.next_provider": "next provider",
+ "ai_settings.provider.no_model": "No model selected",
"ai_settings.provider_preset.anthropic.desc": "Claude Opus/Sonnet",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "Custom API endpoint",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "Volcengine Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "GLM-5 / GLM-5-Turbo",
"ai_settings.provider_preset.zhipu.label": "Zhipu GLM",
- "ai_settings.provider.action.add": "Add model provider",
- "ai_settings.provider.action.delete": "Delete",
- "ai_settings.provider.action.edit": "Edit",
- "ai_settings.provider.auto_model": "Auto-selected",
- "ai_settings.provider.confirm_delete": "Delete this provider?",
- "ai_settings.provider.editor.add_title": "Add model provider",
- "ai_settings.provider.editor.edit_title": "Edit model provider",
- "ai_settings.provider.empty.description": "Add one to start using the AI assistant",
- "ai_settings.provider.empty.title": "No model provider configured",
- "ai_settings.provider.next_provider": "next provider",
- "ai_settings.provider.no_model": "No model selected",
"ai_settings.safety.description": "Control which SQL operation types AI may execute to protect data safety",
"ai_settings.safety.full.desc": "AI may run all operations, including DDL. High-risk operations show warnings automatically.",
"ai_settings.safety.full.label": "Full mode",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "Database",
"ai_settings.skill.scope.global.desc": "Enabled for all AI sessions",
"ai_settings.skill.scope.global.label": "Global",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "Only enabled for the JVM diagnostic workbench",
- "ai_settings.skill.scope.jvm_diagnostic.label": "JVM diagnostics",
"ai_settings.skill.scope.jvm.desc": "Only enabled for JVM resource analysis scenarios",
"ai_settings.skill.scope.jvm.label": "JVM resources",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "Only enabled for the JVM diagnostic workbench",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "JVM diagnostics",
"ai_settings.skill.scopes_placeholder": "Select where this Skill should apply",
"ai_settings.skill.status.disabled": "Disabled",
"ai_settings.skill.status.enabled": "Enabled",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "Optional",
"ai_settings.tools.parameters.required": "Required",
"ai_settings.tools.parameters.type_label": "Type: {{type}}",
- "ai_settings.tools.params_label": "Parameters:",
"ai_settings.tools.params.none": "None",
+ "ai_settings.tools.params_label": "Parameters:",
"ai_settings.tools.search.aria_label": "Search built-in tools",
"ai_settings.tools.search.clear": "Clear",
"ai_settings.tools.search.placeholder": "Search tools, flows, or parameters, for example mcp / lineLimit / allowMutating / transaction",
"ai_settings.tools.summary": "Showing {{flowVisible}}/{{flowTotal}} recommended flows and {{toolVisible}}/{{toolTotal}} built-in tools.",
"ai_settings.tools.workflow": "💡 Workflow: get_connections -> get_databases -> get_tables -> get_columns -> generate SQL",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "Failed to create Claude Code configuration directory: {{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code configuration format is invalid: {{path}} should be {{expected}}",
- "ai.service.mcp_client.claude_code.config_parse_failed": "Failed to parse Claude Code configuration: {{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "Failed to locate Claude Code configuration: {{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "Failed to read Claude Code configuration: {{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "Failed to serialize Claude Code configuration: {{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "Failed to write Claude Code configuration: {{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "Claude Code user-level MCP configuration has been written. Restart Claude CLI, then GoNavi will appear under User MCPs in /mcp.",
- "ai.service.mcp_client.claude_code.status.connected": "Claude Code user-level GoNavi MCP configuration was detected and matches the current GoNavi installation path",
- "ai.service.mcp_client.claude_code.status.missing": "No Claude Code user-level GoNavi MCP configuration was detected",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "A GoNavi MCP record was detected in Claude Code, but the current GoNavi installation path check failed: {{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "A GoNavi MCP record was detected in Claude Code, but it does not match the current GoNavi installation path. Updating is recommended.",
- "ai.service.mcp_client.codex.config_dir_create_failed": "Failed to create Codex configuration directory: {{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Codex configuration format is invalid: {{path}} could not be parsed as {{expected}}",
- "ai.service.mcp_client.codex.config_path_failed": "Failed to locate Codex configuration: {{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "Failed to read Codex configuration: {{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "Failed to write Codex configuration: {{detail}}",
- "ai.service.mcp_client.codex.install_success": "Codex user-level MCP configuration has been written. Restart Codex CLI or the desktop app to see GoNavi.",
- "ai.service.mcp_client.codex.status.connected": "Codex user-level GoNavi MCP configuration was detected and matches the current GoNavi installation path",
- "ai.service.mcp_client.codex.status.missing": "No Codex user-level GoNavi MCP configuration was detected",
- "ai.service.mcp_client.codex.status.path_check_failed": "A GoNavi MCP record was detected in Codex, but the current GoNavi installation path check failed: {{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "A GoNavi MCP record was detected in Codex, but it does not match the current GoNavi installation path. Updating is recommended.",
- "ai.service.mcp_client.executable_path_empty": "Current GoNavi executable path is empty",
- "ai.service.mcp_client.executable_path_failed": "Failed to locate the current GoNavi executable: {{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} usually runs in the cloud or a remote environment. Connect it to Windows GoNavi through a remote MCP bridge; database passwords remain on this GoNavi machine.",
- "ai.service.mcp_client.user_home_dir_unavailable": "Unable to determine the current user home directory",
"app.about.action.check_updates": "Check for Updates",
"app.about.action.download_progress": "Download Progress",
"app.about.action.download_update": "Download Update",
@@ -2433,8 +2433,8 @@
"app.about.hero.update_available_version": "New version {{version}} found",
"app.about.last_checked_at": "Last checked: {{time}}",
"app.about.last_checked_never": "No update check yet",
- "app.about.message.check_failed_with_error": "Update check failed: {{error}}",
"app.about.message.channel_switch_failed_with_error": "Failed to switch update channel: {{error}}",
+ "app.about.message.check_failed_with_error": "Update check failed: {{error}}",
"app.about.message.download_completed": "Update download completed",
"app.about.message.download_completed_with_path": "Update download completed. Package path: {{path}}",
"app.about.message.download_failed_with_error": "Update download failed: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "Browser mock is not connected to a real MCP service",
"app.browser_mock.provider.test_failed_detail": "Connection test failed: {{detail}}",
"app.browser_mock.provider.test_success": "Endpoint connectivity test succeeded",
+ "app.connection.message.editable_load_failed": "Failed to load the saved connection details. The masked configuration will be opened instead.",
+ "app.connection.message.editable_load_failed_with_detail": "Failed to load the saved connection details: {{detail}}. The masked configuration will be opened instead.",
"app.connection_package.action.start_export": "Start Export",
"app.connection_package.action.start_import": "Start Import",
"app.connection_package.dialog.export_title": "Export Connections",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "Imported {{count}} connections. Some connections do not include passwords; edit those connections and enter passwords before saving.",
"app.connection_package.message.no_connections_to_export": "No connections to export",
"app.connection_package.message.unsupported_file_format": "File format error: only GoNavi recovery packages, legacy JSON connection arrays, MySQL Workbench XML, or Navicat NCX are supported",
- "app.connection.message.editable_load_failed": "Failed to load the saved connection details. The masked configuration will be opened instead.",
- "app.connection.message.editable_load_failed_with_detail": "Failed to load the saved connection details: {{detail}}. The masked configuration will be opened instead.",
"app.data_root.action.migrate_and_switch": "Migrate Existing Data and Switch",
"app.data_root.action.open_current": "Open Current Directory",
"app.data_root.action.restore_default_directory": "Restore Default Directory",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "AI Settings",
"app.settings.entry.proxy.description": "Configure update checks, driver management, and public network access.",
"app.settings.entry.proxy.title": "Global Proxy",
- "app.settings.entry.web_auth.description": "View browser access authentication status and change the admin password.",
- "app.settings.entry.web_auth.title": "Browser Access Authentication",
"app.settings.entry.theme.description": "Switch light or dark theme and adjust interface appearance.",
"app.settings.entry.theme.title": "Theme and Appearance",
+ "app.settings.entry.web_auth.description": "View browser access authentication status and change the admin password.",
+ "app.settings.entry.web_auth.title": "Browser Access Authentication",
"app.settings.group.about.description": "Version details, repository links, and other product information.",
"app.settings.group.about.title": "About",
"app.settings.group.preferences.description": "Language, appearance, and sidebar display preferences.",
"app.settings.group.preferences.title": "Preferences",
"app.settings.group.services.description": "Network access and AI-related service configuration.",
"app.settings.group.services.title": "Services",
+ "app.settings.sidebar_metadata.description": "Choose which table metadata appears beside table names in the left sidebar.",
+ "app.settings.sidebar_metadata.title": "Sidebar Table Metadata",
+ "app.settings.title": "Settings Center",
"app.settings.web_auth.description": "View the current browser access authentication status, session policy, and 2FA state. You can also change the admin password after signing in.",
"app.settings.web_auth.load_failed": "Failed to load browser access authentication settings",
"app.settings.web_auth.password.code_label": "Current code / recovery code",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} hours",
"app.settings.web_auth.value.minutes": "{{count}} minutes",
"app.settings.web_auth.value.recovery_codes": "{{count}} remaining",
- "app.settings.sidebar_metadata.description": "Choose which table metadata appears beside table names in the left sidebar.",
- "app.settings.sidebar_metadata.title": "Sidebar Table Metadata",
- "app.settings.title": "Settings Center",
"app.shortcuts.action.diagnoseQuery.description": "Run EXPLAIN on the current SQL and visualize the execution plan with index suggestions",
"app.shortcuts.action.diagnoseQuery.label": "SQL Diagnose",
+ "app.shortcuts.action.duplicateCurrentLine.description": "Duplicate the line at the cursor in the query editor and insert it below",
+ "app.shortcuts.action.duplicateCurrentLine.label": "Duplicate Current Line Below",
"app.shortcuts.action.focusSidebarSearch.description": "Focus the left connection tree search box",
"app.shortcuts.action.focusSidebarSearch.label": "Focus Sidebar Search",
+ "app.shortcuts.action.formatSql.description": "Format SQL in the current query editor",
+ "app.shortcuts.action.formatSql.label": "Format SQL",
"app.shortcuts.action.newConnection.description": "Create a new database, runtime, or other data source connection",
"app.shortcuts.action.newConnection.label": "New Data Source",
"app.shortcuts.action.newQueryTab.description": "Create a new SQL query tab",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "Run SQL",
"app.shortcuts.action.saveQuery.description": "Save the current query tab; unnamed queries open the save dialog",
"app.shortcuts.action.saveQuery.label": "Save Query",
- "app.shortcuts.action.duplicateCurrentLine.description": "Duplicate the line at the cursor in the query editor and insert it below",
- "app.shortcuts.action.duplicateCurrentLine.label": "Duplicate Current Line Below",
- "app.shortcuts.action.formatSql.description": "Format SQL in the current query editor",
- "app.shortcuts.action.formatSql.label": "Format SQL",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "Manually request AI inline completion in the current SQL editor",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "Trigger SQL AI Completion",
"app.shortcuts.action.selectCurrentStatement.description": "Select the line at the cursor in the query editor and copy it to the clipboard",
"app.shortcuts.action.selectCurrentStatement.label": "Select Current Line and Copy",
"app.shortcuts.action.sendAIChatMessage.description": "Send the current message from the AI input; Shift+Enter always inserts a new line",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "Toggle Results Panel",
"app.shortcuts.action.toggleTheme.description": "Switch between light and dark themes",
"app.shortcuts.action.toggleTheme.label": "Toggle Theme",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "Manually request AI inline completion in the current SQL editor",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "Trigger SQL AI Completion",
"app.shortcuts.capture_hint": "Press the shortcut after clicking \"Record\". Press Esc to cancel recording. Global shortcuts should include a modifier; AI chat send only supports Enter-related combinations, and Shift+Enter keeps inserting a new line.",
"app.shortcuts.capture_waiting": "Press a shortcut...",
"app.shortcuts.context.datagrid": "Data Grid",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "Loading local configuration...",
"app.startup_readiness.loading_security_config": "Loading security configuration...",
"app.theme.action.restore_defaults": "Restore Defaults",
- "app.theme.appearance_settings_description": "Adjust scale, font size, transparency, and blur effects in one place.",
- "app.theme.appearance_settings_title": "Appearance Settings",
"app.theme.appearance.blur_hint": "* Only controls blur for in-app overlay layers",
"app.theme.appearance.blur_title": "Gaussian Blur (Blur)",
"app.theme.appearance.enable_transparency_blur": "Enable Transparency and Blur",
"app.theme.appearance.enable_transparency_blur_hint": "When disabled, the current thresholds are retained and restored directly when re-enabled.",
"app.theme.appearance.font_size_title": "Base Font Size (Font Size)",
"app.theme.appearance.opacity_title": "Background Opacity (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "Only affects the V2 left navigation rail. Use it to enlarge buttons and connection icons on large displays.",
+ "app.theme.appearance.sidebar_rail_scale_title": "Left Navigation Button Size",
"app.theme.appearance.transparency_blur_title": "Transparency and Blur Effects",
"app.theme.appearance.ui_scale_hint": "* Recommended for small screens: 85%-95%",
"app.theme.appearance.ui_scale_title": "UI Scale (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "Only affects the V2 left navigation rail. Use it to enlarge buttons and connection icons on large displays.",
- "app.theme.appearance.sidebar_rail_scale_title": "Left Navigation Button Size",
"app.theme.appearance.windows_acrylic_hint": "Windows uses the system Acrylic effect. Blur intensity is controlled by the system.",
+ "app.theme.appearance_settings_description": "Adjust scale, font size, transparency, and blur effects in one place.",
+ "app.theme.appearance_settings_title": "Appearance Settings",
"app.theme.data_table.column_width_hint": "Standard mode defaults to 200px; compact mode defaults to 140px. Manually adjusted column widths are preserved first.",
"app.theme.data_table.column_width_mode": "Data Table Column Width Mode",
"app.theme.data_table.column_width_mode.compact": "Compact 140px",
"app.theme.data_table.column_width_mode.standard": "Standard 200px",
"app.theme.data_table.density": "Table Density",
- "app.theme.data_table.density_hint": "Controls row height, column width, and padding. Comfortable is better for large-screen review; compact maximizes information density. Manually dragged column widths are preserved first.",
"app.theme.data_table.density.comfortable": "Comfortable",
"app.theme.data_table.density.compact": "Compact",
"app.theme.data_table.density.standard": "Standard",
+ "app.theme.data_table.density_hint": "Controls row height, column width, and padding. Comfortable is better for large-screen review; compact maximizes information density. Manually dragged column widths are preserved first.",
"app.theme.data_table.follow_global": "Follow Global",
"app.theme.data_table.font_size": "Data Table Font Size",
"app.theme.data_table.sidebar_tree_font_size": "Sidebar Schema Tree Font Size",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "Mono Font Family",
"app.theme.font_family.title": "Font Family",
"app.theme.font_family.ui_title": "UI Font Family",
- "app.theme.query_template.description": "Configure the SQL that is prefilled when you open a fresh query tab.",
- "app.theme.query_template.hint": "Clear the text to keep new query tabs blank. Use Restore default to go back to SELECT * FROM .",
- "app.theme.query_template.reset_default": "Restore default",
- "app.theme.query_template.title": "New Query Default SQL",
"app.theme.mac_window.restart_hint": "* Custom top-right buttons are hidden; restart the app if the system window style does not refresh immediately",
"app.theme.mac_window.title": "macOS Window Controls",
"app.theme.mac_window.use_native_controls": "Use macOS Native Window Controls",
"app.theme.mac_window.use_native_controls_hint": "Shows the red/yellow/green buttons in the top-left and prioritizes native macOS fullscreen behavior.",
- "app.theme.mode_title": "Theme Mode",
"app.theme.mode.dark.description": "Better for low-light environments with a calmer visual weight.",
"app.theme.mode.dark.label": "Dark Theme",
"app.theme.mode.light.description": "Better for bright environments with lighter visual hierarchy.",
"app.theme.mode.light.label": "Light Theme",
"app.theme.mode.system.description": "Follow the operating system appearance and switch automatically.",
"app.theme.mode.system.label": "Follow System",
+ "app.theme.mode_title": "Theme Mode",
"app.theme.nav.appearance.description": "Scale, font, and transparency",
"app.theme.nav.appearance.title": "Appearance Parameters",
"app.theme.nav.theme.description": "Light and dark switching",
"app.theme.nav.theme.title": "Theme Mode",
"app.theme.navigation_title": "Settings Navigation",
+ "app.theme.query_template.description": "Configure the SQL that is prefilled when you open a fresh query tab.",
+ "app.theme.query_template.hint": "Clear the text to keep new query tabs blank. Use Restore default to go back to SELECT * FROM .",
+ "app.theme.query_template.reset_default": "Restore default",
+ "app.theme.query_template.title": "New Query Default SQL",
"app.theme.startup_window.fullscreen": "Fullscreen on startup",
"app.theme.startup_window.fullscreen_windows": "Fullscreen on startup (Windows treats this as maximize)",
"app.theme.startup_window.hint": "* Takes effect on next startup",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "Hide to Background",
"app.update.action.install_update": "Install Update",
"app.update.action.open_install_directory": "Open Install Directory",
+ "app.update.backend.error.channel_invalid": "Invalid update channel: {{channel}}",
"app.update.backend.error.check_failed": "Check for updates failed: {{detail}}",
"app.update.backend.error.check_http_status": "Check for updates failed: HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "Invalid update channel: {{channel}}",
"app.update.backend.error.download_failed": "Update download failed: {{detail}}",
+ "app.update.backend.error.install_target_not_writable": "The current install directory is not writable: {{path}} ({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "Unable to determine the current install directory",
"app.update.backend.error.install_unsupported": "Update installation is not supported on this platform: {{platform}}",
"app.update.backend.error.latest_version_unparseable": "Unable to parse the latest version",
"app.update.backend.error.network_dns": "Failed to reach GitHub: unable to resolve {{host}}. Confirm the global proxy has been applied, or test it in Global Proxy settings first.",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS does not include the current platform update package",
"app.update.backend.error.sha256sums_download_failed": "Failed to download SHA256SUMS: HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release did not provide SHA256SUMS",
- "app.update.backend.error.install_target_not_writable": "The current install directory is not writable: {{path}} ({{detail}})",
- "app.update.backend.error.install_target_unresolved": "Unable to determine the current install directory",
"app.update.backend.error.update_package_not_found": "Update package not found: {{name}}",
"app.update.backend.message.app_directory_unavailable": "Cannot access app directory: {{path}}",
"app.update.backend.message.app_directory_unresolved_download": "Cannot determine the current app directory, so the update cannot be downloaded",
@@ -3015,6 +3015,64 @@
"common.success": "Success",
"common.unknown": "Unknown",
"common.warning": "Warning",
+ "connection.backend.action.apply_result_changes": "Apply result changes",
+ "connection.backend.action.clear_table": "Clear table data",
+ "connection.backend.action.create_database": "Create database",
+ "connection.backend.action.create_schema": "Create schema",
+ "connection.backend.action.data_sync_structure": "Modify sync target structure",
+ "connection.backend.action.data_sync_write": "Write synchronized data",
+ "connection.backend.action.drop_database": "Drop database",
+ "connection.backend.action.drop_function_or_procedure": "Drop function or stored procedure",
+ "connection.backend.action.drop_schema": "Drop schema",
+ "connection.backend.action.drop_table": "Drop table",
+ "connection.backend.action.drop_view": "Drop view",
+ "connection.backend.action.import_data": "Import data",
+ "connection.backend.action.preview_result_changes": "Preview result changes",
+ "connection.backend.action.rename_database": "Rename database",
+ "connection.backend.action.rename_schema": "Rename schema",
+ "connection.backend.action.rename_table": "Rename table",
+ "connection.backend.action.rename_view": "Rename view",
+ "connection.backend.action.truncate_table": "Truncate table",
+ "connection.backend.error.readonly_action_blocked": "This connection has production guard enabled. {{action}} is not allowed.",
+ "connection.copy_suffix": " - Copy",
+ "connection.delete": "Delete Connection",
+ "connection.edit": "Edit Connection",
+ "connection.new": "New Connection",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase only supports MySQL/Oracle tenant protocols; \"{{value}}\" is not supported. Switch to MySQL or Oracle.",
+ "connection.sidebar.delete.backendUnavailable": "Failed to delete connection: backend interface unavailable",
+ "connection.sidebar.delete.confirmContent": "Are you sure you want to delete connection \"{{name}}\"?",
+ "connection.sidebar.delete.confirmTitle": "Confirm deletion",
+ "connection.sidebar.delete.failureFallback": "Failed to delete connection",
+ "connection.sidebar.delete.success": "Connection deleted",
+ "connection.sidebar.disconnect.success": "Disconnected",
+ "connection.sidebar.duplicate.backendUnavailable": "Failed to copy connection: backend interface unavailable",
+ "connection.sidebar.duplicate.failureFallback": "Failed to copy connection",
+ "connection.sidebar.duplicate.noResult": "Failed to copy connection: backend returned no result",
+ "connection.sidebar.duplicate.success": "Connection copied: {{name}}",
+ "connection.sidebar.group.badge": "GROUP",
+ "connection.sidebar.group.collapseAria": "Collapse connection group {{name}}",
+ "connection.sidebar.group.delete": "Delete group",
+ "connection.sidebar.group.deleteConfirmContent": "Delete group \"{{name}}\"? Connections inside it will not be removed.",
+ "connection.sidebar.group.deleteConfirmTitle": "Confirm deletion",
+ "connection.sidebar.group.edit": "Edit group",
+ "connection.sidebar.group.expandAria": "Expand connection group {{name}}",
+ "connection.sidebar.group.meta": "{{count}} connections · Connection group",
+ "connection.sidebar.group.untitled": "Untitled group",
+ "connection.sidebar.menu.copy": "Copy connection",
+ "connection.sidebar.menu.createDatabase": "New database",
+ "connection.sidebar.menu.current": "Current",
+ "connection.sidebar.menu.delete": "Delete connection",
+ "connection.sidebar.menu.disconnect": "Disconnect",
+ "connection.sidebar.menu.groupSection": "Connection groups",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "Address not configured",
+ "connection.sidebar.menu.moveOutTag": "Remove from tag",
+ "connection.sidebar.menu.moveToTag": "Move to tag",
+ "connection.sidebar.menu.moveToUngrouped": "Remove from group",
+ "connection.sidebar.menu.refresh": "Refresh connection",
+ "connection.sidebar.menu.section": "Connection",
+ "connection.test": "Test Connection",
+ "connection.unnamed": "Unnamed Connection",
"connection_modal.action.browse": "Browse...",
"connection_modal.action.cancel": "Cancel",
"connection_modal.action.close": "Close",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "Enter, generate, or parse a connection URI.",
"connection_modal.config_section.uri.title": "Connection URI",
"connection_modal.db_icon_label.custom": "Custom",
+ "connection_modal.db_type.custom": "Custom",
"connection_modal.db_type_hint.custom": "Connect with a custom driver and DSN.",
"connection_modal.db_type_hint.file": "Select a local SQLite or DuckDB database file.",
"connection_modal.db_type_hint.mongodb": "Connect to MongoDB standalone, Replica Set, or SRV addresses.",
"connection_modal.db_type_hint.redis": "Connect to Redis standalone or Redis Cluster.",
"connection_modal.db_type_hint.standard": "Enter host, port, authentication details, and an optional database.",
- "connection_modal.db_type.custom": "Custom",
"connection_modal.driver.current": "Current",
"connection_modal.error.unknown": "Unknown error",
"connection_modal.error.unknown_exception": "Unknown error",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "Connection name",
"connection_modal.field.connection_timeout_seconds": "Connection timeout (seconds)",
"connection_modal.field.connection_timeout_seconds_ascii": "Connection timeout (seconds)",
- "connection_modal.field.default_database_optional": "Default database (optional)",
"connection_modal.field.defaultDatabase.placeholder": "For example: appdb",
+ "connection_modal.field.default_database_optional": "Default database (optional)",
"connection_modal.field.display_databases_optional": "Display databases (optional)",
- "connection_modal.field.driver_name": "Driver name",
"connection_modal.field.driver.placeholder": "For example: mysql, postgres",
+ "connection_modal.field.driver_name": "Driver name",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "For example: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "File path (absolute path)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Replica set username (optional)",
"connection_modal.field.replica_username_optional": "Replica username (optional)",
"connection_modal.field.save_password": "Save password",
- "connection_modal.field.service_name": "Service name",
"connection_modal.field.serviceName.placeholder": "For example: ORCLPDB1",
+ "connection_modal.field.service_name": "Service name",
"connection_modal.field.ssh_host": "SSH host",
"connection_modal.field.ssh_password": "SSH password",
"connection_modal.field.ssh_user": "SSH user",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "Connect through a GoNavi Agent when direct network access is restricted.",
"connection_modal.jvm.agent_help": "Base URL of the GoNavi Agent service.",
"connection_modal.jvm.agent_url": "Agent URL",
- "connection_modal.jvm.diagnostic_api_key_optional": "Diagnostic API key (optional)",
- "connection_modal.jvm.diagnostic_description": "Enable optional diagnostic commands for JVM troubleshooting.",
- "connection_modal.jvm.diagnostic_disabled_hint": "Diagnostic enhancement is disabled. Enable it only when you need runtime troubleshooting.",
- "connection_modal.jvm.diagnostic_timeout_seconds": "Diagnostic timeout (seconds)",
- "connection_modal.jvm.diagnostic_title": "Diagnostic enhancement",
- "connection_modal.jvm.diagnostic_transport": "Diagnostic transport",
"connection_modal.jvm.diagnostic.agent_bridge_description": "Use the GoNavi Agent Bridge diagnostic endpoint.",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "Use Arthas Tunnel to reach the target JVM.",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Base URL of the Arthas Tunnel server.",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "Allow tracing and watch commands that add runtime overhead.",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "Diagnostic API key (optional)",
+ "connection_modal.jvm.diagnostic_description": "Enable optional diagnostic commands for JVM troubleshooting.",
+ "connection_modal.jvm.diagnostic_disabled_hint": "Diagnostic enhancement is disabled. Enable it only when you need runtime troubleshooting.",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "Diagnostic timeout (seconds)",
+ "connection_modal.jvm.diagnostic_title": "Diagnostic enhancement",
+ "connection_modal.jvm.diagnostic_transport": "Diagnostic transport",
"connection_modal.jvm.endpoint_api_key_optional": "Endpoint API key (optional)",
"connection_modal.jvm.endpoint_description": "Connect to a service-provided Endpoint instead of direct JMX.",
"connection_modal.jvm.endpoint_help": "Base URL of the JVM management Endpoint.",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "Configure one NameServer for local or simple environments.",
"connection_modal.messageQueue.rocketmq.topology.single.label": "Single NameServer",
"connection_modal.messageQueue.topology.cluster.label": "Cluster mode",
- "connection_modal.mongodb.auth_mechanism": "Authentication mechanism",
"connection_modal.mongodb.auth.auto": "Auto",
"connection_modal.mongodb.auth.auto_description": "Let the driver choose the authentication mechanism.",
"connection_modal.mongodb.auth.aws_iam_description": "Use AWS IAM authentication. Keep AWS IAM credentials in the runtime environment.",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "Connect without MongoDB authentication.",
"connection_modal.mongodb.auth.scram_sha1_description": "Use SCRAM-SHA-1 authentication.",
"connection_modal.mongodb.auth.scram_sha256_description": "Use SCRAM-SHA-256 authentication.",
+ "connection_modal.mongodb.auth_mechanism": "Authentication mechanism",
"connection_modal.mongodb.discovery.current": "Current",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "When SRV and SSH tunnel are both enabled, local DNS resolution may be required.",
"connection_modal.mongodb.discovery.srv.description": "Use mongodb+srv and let DNS discover target nodes.",
"connection_modal.mongodb.discovery.srv.label": "SRV address",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "When SRV and SSH tunnel are both enabled, local DNS resolution may be required.",
"connection_modal.mongodb.discovery.standard.description": "Connect directly with host:port or use a replica set node list.",
"connection_modal.mongodb.discovery.standard.label": "Standard address",
"connection_modal.mongodb.members.health": "Health",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "On",
"connection_modal.table.health": "Health",
"connection_modal.table.role": "Role",
+ "connection_modal.test.redis_database_list_failure": "Connected, but failed to load the Redis database list: {{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "Connected, but loading the Redis database list timed out (>{{seconds}} seconds)",
"connection_modal.test_error.description": "View the full error returned by the backend.",
"connection_modal.test_error.empty": "No error details",
"connection_modal.test_error.title": "Connection test failure details",
- "connection_modal.test.redis_database_list_failure": "Connected, but failed to load the Redis database list: {{detail}}",
- "connection_modal.test.redis_database_list_timeout": "Connected, but loading the Redis database list timed out (>{{seconds}} seconds)",
"connection_modal.title.create": "New {{type}} connection",
"connection_modal.title.create_description": "Enter and save the connection configuration.",
"connection_modal.title.edit": "Edit connection",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "Enter the HTTP Tunnel host",
"connection_modal.validation.tunnel_port_required": "Enter the HTTP Tunnel port",
"connection_modal.validation.username_required": "Enter the username",
- "connection.backend.action.apply_result_changes": "Apply result changes",
- "connection.backend.action.clear_table": "Clear table data",
- "connection.backend.action.create_database": "Create database",
- "connection.backend.action.create_schema": "Create schema",
- "connection.backend.action.data_sync_structure": "Modify sync target structure",
- "connection.backend.action.data_sync_write": "Write synchronized data",
- "connection.backend.action.drop_database": "Drop database",
- "connection.backend.action.drop_function_or_procedure": "Drop function or stored procedure",
- "connection.backend.action.drop_schema": "Drop schema",
- "connection.backend.action.drop_table": "Drop table",
- "connection.backend.action.drop_view": "Drop view",
- "connection.backend.action.import_data": "Import data",
- "connection.backend.action.preview_result_changes": "Preview result changes",
- "connection.backend.action.rename_database": "Rename database",
- "connection.backend.action.rename_schema": "Rename schema",
- "connection.backend.action.rename_table": "Rename table",
- "connection.backend.action.rename_view": "Rename view",
- "connection.backend.action.truncate_table": "Truncate table",
- "connection.backend.error.readonly_action_blocked": "This connection has production guard enabled. {{action}} is not allowed.",
- "connection.copy_suffix": " - Copy",
- "connection.delete": "Delete Connection",
- "connection.edit": "Edit Connection",
- "connection.new": "New Connection",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase only supports MySQL/Oracle tenant protocols; \"{{value}}\" is not supported. Switch to MySQL or Oracle.",
- "connection.sidebar.delete.backendUnavailable": "Failed to delete connection: backend interface unavailable",
- "connection.sidebar.delete.confirmContent": "Are you sure you want to delete connection \"{{name}}\"?",
- "connection.sidebar.delete.confirmTitle": "Confirm deletion",
- "connection.sidebar.delete.failureFallback": "Failed to delete connection",
- "connection.sidebar.delete.success": "Connection deleted",
- "connection.sidebar.disconnect.success": "Disconnected",
- "connection.sidebar.duplicate.backendUnavailable": "Failed to copy connection: backend interface unavailable",
- "connection.sidebar.duplicate.failureFallback": "Failed to copy connection",
- "connection.sidebar.duplicate.noResult": "Failed to copy connection: backend returned no result",
- "connection.sidebar.duplicate.success": "Connection copied: {{name}}",
- "connection.sidebar.group.badge": "GROUP",
- "connection.sidebar.group.collapseAria": "Collapse connection group {{name}}",
- "connection.sidebar.group.delete": "Delete group",
- "connection.sidebar.group.deleteConfirmContent": "Delete group \"{{name}}\"? Connections inside it will not be removed.",
- "connection.sidebar.group.deleteConfirmTitle": "Confirm deletion",
- "connection.sidebar.group.edit": "Edit group",
- "connection.sidebar.group.expandAria": "Expand connection group {{name}}",
- "connection.sidebar.group.meta": "{{count}} connections · Connection group",
- "connection.sidebar.group.untitled": "Untitled group",
- "connection.sidebar.menu.copy": "Copy connection",
- "connection.sidebar.menu.createDatabase": "New database",
- "connection.sidebar.menu.current": "Current",
- "connection.sidebar.menu.delete": "Delete connection",
- "connection.sidebar.menu.disconnect": "Disconnect",
- "connection.sidebar.menu.groupSection": "Connection groups",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "Address not configured",
- "connection.sidebar.menu.moveOutTag": "Remove from tag",
- "connection.sidebar.menu.moveToTag": "Move to tag",
- "connection.sidebar.menu.moveToUngrouped": "Remove from group",
- "connection.sidebar.menu.refresh": "Refresh connection",
- "connection.sidebar.menu.section": "Connection",
- "connection.test": "Test Connection",
- "connection.unnamed": "Unnamed Connection",
"data_export.action.clear": "Clear",
"data_export.action.clear_progress": "Clear current progress",
"data_export.action.select_all": "Select all",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "Now",
"data_grid.cell_editor.title": "Edit cell",
"data_grid.cell_editor.title_with_column": "Edit cell: {{column}}",
+ "data_grid.column.comment_tooltip": "Comment: {{comment}}",
+ "data_grid.column.drag_tooltip": "Drag to reorder columns",
+ "data_grid.column.foreign_key_jump_title": "Open foreign key table: {{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "Foreign key: {{target}}",
+ "data_grid.column.resize_tooltip": "Drag to resize column, double-click to auto fit",
+ "data_grid.column.type_tooltip": "Type: {{type}}",
"data_grid.column_quick_find.placeholder": "Jump to column...",
"data_grid.column_quick_find.tooltip": "Type a column name, then press Enter or the locate button to jump to that column",
"data_grid.column_settings.column_visibility": "Column visibility",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "Show all",
"data_grid.column_settings.show_comments": "Show column comments in header",
"data_grid.column_settings.show_types": "Show column types in header",
- "data_grid.column.comment_tooltip": "Comment: {{comment}}",
- "data_grid.column.drag_tooltip": "Drag to reorder columns",
- "data_grid.column.foreign_key_jump_title": "Open foreign key table: {{tableName}}",
- "data_grid.column.foreign_key_tooltip": "Foreign key: {{target}}",
- "data_grid.column.resize_tooltip": "Drag to resize column, double-click to auto fit",
- "data_grid.column.type_tooltip": "Type: {{type}}",
"data_grid.context_menu.auto_fit_column": "Auto-fit column width to content",
"data_grid.context_menu.clear_column_sort": "Clear sort for this field",
"data_grid.context_menu.column_display_section": "Field display",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "No rows are selected. Choose an export scope:",
"data_grid.export.options_title": "Export options",
"data_grid.export.query_result_title": "Export query results",
- "data_grid.export.scope_prompt": "Choose export scope:",
"data_grid.export.scope.all_results_cached": "All results (current cache {{count}} rows)",
"data_grid.export.scope.all_results_cached_description": "Exports all results from the current cache when the current query cannot be replayed.",
"data_grid.export.scope.all_results_requery": "All results (rerun query)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "Selected rows",
"data_grid.export.scope.selected_rows_count": "Selected rows ({{count}} rows)",
"data_grid.export.scope.selected_rows_description": "Export only the checked rows in the current result set.",
+ "data_grid.export.scope_prompt": "Choose export scope:",
"data_grid.export.selected_rows": "Export selected rows ({{count}} rows)",
"data_grid.filter.add_condition": "Add condition",
"data_grid.filter.add_sort": "Add sort",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "Go",
"data_grid.pagination.jump_aria": "Jump to page",
"data_grid.pagination.jump_label": "Jump",
- "data_grid.pagination.page_size_aria": "Rows per page",
- "data_grid.pagination.page_size_option": "{{count}} rows / page",
"data_grid.pagination.page.current": "Page {{current}}",
"data_grid.pagination.page.known": "Page {{current}} / {{totalPages}}",
+ "data_grid.pagination.page_size_aria": "Rows per page",
+ "data_grid.pagination.page_size_option": "{{count}} rows / page",
"data_grid.pagination.result_set": "Result set",
"data_grid.pagination.summary.approximate": "Current {{current}} rows / about {{total}} rows",
"data_grid.pagination.summary.cancelled": "Current {{current}} rows / count cancelled",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "Configure Source and Target",
"data_sync.step.result": "Execution Result",
"data_sync.step.select_tables": "Select Tables",
- "data_sync.table_picker.help": "Select tables to sync:",
- "data_sync.table_picker.item_unit": "item",
- "data_sync.table_picker.items_unit": "items",
- "data_sync.table_picker.not_found": "No data",
- "data_sync.table_picker.search_placeholder": "Search tables...",
- "data_sync.table_picker.selected_title": "Selected Tables",
- "data_sync.table_picker.show_same": "Show Same Tables",
- "data_sync.table_picker.source_title": "Source Tables",
"data_sync.table.delete": "Delete",
"data_sync.table.insert": "Insert",
"data_sync.table.plan": "Plan",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "Missing",
"data_sync.table.target_table": "Target Table",
"data_sync.table.update": "Update",
+ "data_sync.table_picker.help": "Select tables to sync:",
+ "data_sync.table_picker.item_unit": "item",
+ "data_sync.table_picker.items_unit": "items",
+ "data_sync.table_picker.not_found": "No data",
+ "data_sync.table_picker.search_placeholder": "Search tables...",
+ "data_sync.table_picker.selected_title": "Selected Tables",
+ "data_sync.table_picker.show_same": "Show Same Tables",
+ "data_sync.table_picker.source_title": "Source Tables",
"data_sync.title.compare_result": "Comparison Result",
"data_sync.title.execution_log": "Execution Log",
"data_sync.title.migration": "Cross-Database Migration",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "Database connection not found",
"definition_viewer.error.event_name_empty": "Event name is empty",
"definition_viewer.error.load_failed": "Load failed",
+ "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.query_failed": "Failed to query definition",
"definition_viewer.error.query_failed_detail": "Failed to query definition: {{detail}}",
- "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.routine_name_empty": "Function/procedure name is empty",
"definition_viewer.error.sequence_name_empty": "Sequence name is empty",
"definition_viewer.error.view_name_empty": "View name is empty",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "Legacy",
"dev.perf_data_grid.ui_version.v2": "New UI",
"dev.perf_data_grid.ui_version.v2_short": "New",
+ "driver.guidance.customConnectionDriverHelp": "Supported: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; aliases include postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Enter a Go database/sql driver name already registered by GoNavi. Do not enter a system ODBC/JDBC driver name directly or import a JDBC Jar.",
"driver_manager.action.close": "Close",
"driver_manager.action.import_directory": "Import Driver Directory",
"driver_manager.action.import_package": "Import Driver Package",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "Inline \"Import Driver Package\" only supports a single driver file or bundle, such as `mariadb-driver-agent`, `mariadb-driver-agent.exe`, or `GoNavi-DriverAgents.zip`. It does not import a JDBC Jar directly; use \"Import Driver Directory\" above for batch import.",
"driver_manager.local_source.directory": "directory",
"driver_manager.local_source.file": "file",
- "driver_manager.log_modal.empty": "This driver has no operation logs yet.",
- "driver_manager.log_modal.executable_path": "Driver executable: {{path}}",
- "driver_manager.log_modal.install_dir": "Install directory: {{path}}",
- "driver_manager.log_modal.title": "Driver Logs - {{name}}",
"driver_manager.log.done_auto_install": "Automatic installation completed{{version}}",
"driver_manager.log.done_local_import": "Local import installation completed{{version}}",
"driver_manager.log.done_remove": "Driver removal completed",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "Starting automatic installation",
"driver_manager.log.start_local_import": "Starting local import{{version}} ({{source}}): {{path}}",
"driver_manager.log.start_remove": "Starting driver removal",
+ "driver_manager.log_modal.empty": "This driver has no operation logs yet.",
+ "driver_manager.log_modal.executable_path": "Driver executable: {{path}}",
+ "driver_manager.log_modal.install_dir": "Install directory: {{path}}",
+ "driver_manager.log_modal.title": "Driver Logs - {{name}}",
"driver_manager.message.directory_import_completed": "Directory import completed{{mode}}: {{success}} succeeded{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "Directory import completed{{mode}}: {{success}} succeeded, {{failed}} failed{{skip}}",
"driver_manager.message.directory_import_failed": "Directory import failed{{mode}}: {{failed}} failed{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "Failed to select local driver package directory: {{detail}}",
"driver_manager.message.select_local_file_failed": "Failed to select local driver package file",
"driver_manager.message.select_local_file_failed_detail": "Failed to select local driver package file: {{detail}}",
- "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.message.skip.dedupe": "{{count}} dedupe skipped",
"driver_manager.message.skip.slim": "{{count}} slim-build skipped",
+ "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.network.alert.download_chain_unreachable": "Important: driver download route domains are unreachable",
"driver_manager.network.alert.download_network_unreachable": "Important: driver download network is unreachable",
"driver_manager.network.chain_alert.allow_hosts": "If it still fails, allow these hosts in the proxy rules: {{hosts}}. If the rules cannot be adjusted, consider enabling TUN mode.",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "Currently installed {{installedVersion}}; selected {{targetVersion}}. Click \"Switch version\" to apply.",
"driver_manager.version.target_fallback": "target version",
"driver_manager.version.unlabeled": "Unlabeled version",
- "driver.guidance.customConnectionDriverHelp": "Supported: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; aliases include postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Enter a Go database/sql driver name already registered by GoNavi. Do not enter a system ODBC/JDBC driver name directly or import a JDBC Jar.",
"file.backend.dialog.export_connections": "Export connections",
"file.backend.dialog.export_data": "Export data",
"file.backend.dialog.export_database_sql": "Export {{database}} (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "Importing data...",
"import_preview.status.loading_preview": "Loading preview data...",
"import_preview.title": "Import data preview",
+ "jvm.backend.capability.reason.read_only": "Current connection is read-only",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "Enter a full http:// or https:// URL, for example http://127.0.0.1:19090/gonavi/agent/jvm.",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent connection failed: Agent Base URL is invalid.",
+ "jvm.backend.connection_error.agent.base_url_required": "Agent connection failed: Agent Base URL is missing.",
+ "jvm.backend.connection_error.agent.connection_refused.help": "Confirm the Java service started GoNavi Agent with `-javaagent`, and check Base URL, port mapping, and firewall rules.",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Agent connection failed: the target Agent management port is not listening, or the address is unreachable.",
+ "jvm.backend.connection_error.agent.forbidden.help": "Confirm that client source, authentication settings, and Agent access policy allow GoNavi to access it.",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Agent connection failed: Agent rejected this request.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "Change Agent Base URL to an address that starts with http:// or https://.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent connection failed: only HTTP or HTTPS is supported.",
+ "jvm.backend.connection_error.agent.timeout.help": "Confirm the target address is reachable, the Agent has started, and increase the connection timeout if needed.",
+ "jvm.backend.connection_error.agent.timeout.summary": "Agent connection failed: timed out while accessing the Agent management port.",
+ "jvm.backend.connection_error.agent.unauthorized.help": "Check whether the Agent API Key in the connection matches the target service startup parameters.",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Agent connection failed: Agent responded, but the API Key is missing or invalid.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Enter a full http:// or https:// URL that points to the management API root implementing the GoNavi JVM HTTP contract, for example http://127.0.0.1:19090/manage/jvm.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint connection failed: Endpoint Base URL is invalid.",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint connection failed: Endpoint Base URL is missing.",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "Confirm that Base URL points to the management API implementing the GoNavi JVM HTTP contract, and check service listening, port mapping, and firewall rules.",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint connection failed: the target management API is not listening, or the address is unreachable.",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "Confirm that client source, authentication settings, and access policy allow GoNavi to access this management API.",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint connection failed: the target management API rejected this request.",
+ "jvm.backend.connection_error.endpoint.not_found.help": "Confirm that Base URL points to the JVM management API root, not a business endpoint, health check, or gateway home page.",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint connection failed: the target responded, but the GoNavi JVM management API was not found.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Change Endpoint Base URL to an address that starts with http:// or https://.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint connection failed: only HTTP or HTTPS is supported.",
+ "jvm.backend.connection_error.endpoint.timeout.help": "Confirm Base URL is reachable, the target service has started, and increase the connection timeout if needed.",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint connection failed: timed out while accessing the target management API.",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "Check whether the Endpoint API Key in the connection matches the target service configuration.",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint connection failed: the target management API responded, but the API Key is missing or invalid.",
+ "jvm.backend.connection_error.generic": "JVM connection failed",
+ "jvm.backend.connection_error.jmx.auth.help": "Confirm whether target JMX disables authentication. If authentication is required, provide username and password before connecting.",
+ "jvm.backend.connection_error.jmx.auth.summary": "JMX connection failed: {{target}} requires authentication, or the current credentials are invalid.",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "Confirm remote JMX is enabled on the target JVM, and check host, firewall, port mapping, SSH, and proxy settings.",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX connection failed: cannot connect to {{target}} because the port is not listening or the network is unreachable.",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "Confirm the configured port is the JVM's exposed JMX port, not a business port, debug port, or proxied port.",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX connection failed: the service on {{target}} closed the connection; the port is not a compatible standard JMX RMI port.",
+ "jvm.backend.connection_error.jmx.host_required": "JMX connection failed: host is missing.",
+ "jvm.backend.connection_error.jmx.java_missing.help": "Install JRE/JDK first, or point the GONAVI_JMX_JAVA_BIN environment variable to the correct `java` executable.",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "JMX connection failed: the current machine cannot find the `java` runtime, so GoNavi cannot start the JMX helper.",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "This usually means the port is an RMI registry, debug port, or another Java service port. Check the `jmxremote.port` and `jmxremote.rmi.port` settings.",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX connection failed: {{target}} has an RMI service, but it is not a usable JMX RMIServer port.",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "Use the actual JMX port exposed by the application, not the business `server.port`. If the service only enables `-Dcom.sun.management.jmxremote` without `jmxremote.port`, it cannot be connected remotely.",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX connection failed: {{target}} is not a standard JMX remote management port; it looks like a business or HTTP port.",
+ "jvm.backend.connection_error.jmx.port_invalid": "JMX connection failed: port is invalid. Enter a valid port from 1 to 65535.",
+ "jvm.backend.connection_error.jmx.timeout.help": "Confirm the port is reachable, the network is not blocked, and increase the connection timeout if needed.",
+ "jvm.backend.connection_error.jmx.timeout.summary": "JMX connection failed: connection to {{target}} timed out.",
+ "jvm.backend.connection_error.suggestion": "Suggestion: {{detail}}",
+ "jvm.backend.connection_error.technical_detail": "Technical detail: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel address is invalid: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel address is required",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "The active command in this Arthas Tunnel session does not match the command to cancel.",
+ "jvm.backend.diagnostic.arthas.command_already_running": "This Arthas Tunnel session already has a running command. Wait for it to finish or cancel it first.",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel command was canceled",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel command timed out after {{timeout}}",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket connection was canceled",
+ "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket connection failed: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket connection timed out after {{timeout}} without a response",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel connection closed: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel connection closed: code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel connection is not ready. Try again later.",
+ "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel connection failed: HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "This Arthas Tunnel session has no running command.",
+ "jvm.backend.diagnostic.arthas.read_canceled": "Reading Arthas Tunnel output was canceled",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Failed to set Arthas Tunnel read deadline: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "Failed to read Arthas Tunnel output: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "Reading Arthas Tunnel output timed out after {{timeout}} without a response",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Failed to encode Arthas Tunnel request: {{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel only supports http/https/ws/wss addresses: {{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "Sending the Arthas Tunnel terminal command was canceled",
+ "jvm.backend.diagnostic.arthas.send_failed": "Failed to send Arthas Tunnel terminal command: {{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "Sending the Arthas Tunnel terminal command timed out after {{timeout}} without a response",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel session configuration changed. Create the diagnostic session again.",
+ "jvm.backend.diagnostic.arthas.session_missing": "Diagnostic session does not exist. Create the Arthas Tunnel session again.",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel target ID is required (targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "Target instance was not found. Check targetId / agentId and make sure the tunnel client is online.",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Target instance {{target}} was not found. Check targetId / agentId and make sure the tunnel client is online.",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Failed to encode Arthas Tunnel terminal command: {{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Failed to set Arthas Tunnel write deadline: {{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "Failed to write diagnostic audit record, command execution was blocked: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "Cancel command requires sessionId and commandId",
+ "jvm.backend.diagnostic.error.command_required": "Diagnostic command cannot be empty",
+ "jvm.backend.diagnostic.error.disabled": "JVM diagnostic enhancement is not enabled for this connection",
+ "jvm.backend.diagnostic.error.execute_canceled": "Diagnostic execute request was canceled: {{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "Diagnostic session ID is required. Create a session first.",
+ "jvm.backend.diagnostic.error.transport_unsupported": "Unsupported JVM diagnostic transport: {{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas command canceled",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas command completed",
+ "jvm.backend.diagnostic.message.cancel_requested": "Cancel request sent; waiting for the diagnostic bridge to stop the command",
+ "jvm.backend.diagnostic.message.command_completed": "Diagnostic command completed",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnostic command does not support newlines or multiple commands",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "High-risk diagnostic commands are not enabled for this connection: {{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe diagnostic commands are not enabled for this connection: {{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "Current connection is read-only. Only observe diagnostic commands are allowed",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace diagnostic commands are not enabled for this connection: {{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "Failed to write audit record: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "Failed to write audit record, JVM change was blocked: {{detail}}",
+ "jvm.backend.error.change_action_required": "JVM change action is required",
+ "jvm.backend.error.change_blocked_by_guard": "The current change was blocked by Guard",
+ "jvm.backend.error.change_blocked_read_only": "Current connection is read-only, so writes are blocked",
+ "jvm.backend.error.change_confirmation_token_failed": "Failed to generate JVM change confirmation token: {{detail}}",
+ "jvm.backend.error.change_reason_required": "JVM change reason is required",
+ "jvm.backend.error.change_resource_id_required": "JVM resource ID is required",
+ "jvm.backend.error.confirmation_token_expired": "Confirmation token expired. Preview and confirm again.",
+ "jvm.backend.error.confirmation_token_invalid": "Confirmation token is invalid. Preview and confirm again.",
+ "jvm.backend.error.confirmation_token_missing": "Confirmation token is missing. Complete preview confirmation first.",
+ "jvm.backend.error.disallowed_mode": "Current connection does not allow {{mode}} mode",
+ "jvm.backend.error.preview_confirmation_missing": "Preview confirmation token is missing. Preview again before submitting.",
+ "jvm.backend.error.preview_context_hash_failed": "Failed to generate JVM preview context: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "Failed to generate JVM preview payload digest: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "Invalid JVM resource path: {{detail}}",
+ "jvm.backend.message.connect_success": "JVM connection succeeded",
+ "jvm.backend.monitoring.error.session_not_found": "Monitoring session not found for {{connectionId}} {{providerMode}}",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} monitoring snapshot is not supported yet",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "Monitoring sampling failed {{count}} consecutive times and this session was stopped automatically",
+ "jvm.backend.separator.message_warning": "; ",
+ "jvm.backend.warning.failed_audit_write_failed": "Failed to write failure audit record: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "Failed to write terminal audit record: {{detail}}",
"jvm_ai_plan.actions.description": ": {{description}}",
"jvm_ai_plan.actions.field_separator": ", ",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "AI diagnostic plan: {{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "The AI plan diagnostic transport is {{planTransport}}, which does not match the current console {{currentTransport}}. Regenerate the plan before applying it.",
"jvm_diagnostic.ai_plan.message.filled": "AI diagnostic plan filled into the console",
+ "jvm_diagnostic.capability.empty.description": "Capability checks only read transport permissions and command policy. They do not create a session or run commands.",
+ "jvm_diagnostic.capability.empty.title": "No capability check yet",
"jvm_diagnostic.capability_result.mutating_allowed": "High-risk commands",
"jvm_diagnostic.capability_result.observe_allowed": "Observe commands",
"jvm_diagnostic.capability_result.observe_denied": "Observe disabled",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "Streaming unsupported",
"jvm_diagnostic.capability_result.title": "Capability check results",
"jvm_diagnostic.capability_result.trace_allowed": "Trace commands",
- "jvm_diagnostic.capability.empty.description": "Capability checks only read transport permissions and command policy. They do not create a session or run commands.",
- "jvm_diagnostic.capability.empty.title": "No capability check yet",
"jvm_diagnostic.command_input.command_description": "Enter an Arthas/diagnostic command, for example thread -n 5, dashboard, or jvm; templates below can fill this in with one click.",
"jvm_diagnostic.command_input.command_label": "Diagnostic command",
"jvm_diagnostic.command_input.description": "Supports autocomplete. Press Ctrl/Cmd + Enter to run.",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "Manual input",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "Session started from the console",
+ "jvm_diagnostic.session.default_title": "JVM diagnostic console",
"jvm_diagnostic.session_capability.action.clear_output": "Clear output",
"jvm_diagnostic.session_capability.action.refresh_history": "Refresh history",
"jvm_diagnostic.session_capability.description": "Current transport, permissions, and quick maintenance",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "No session",
"jvm_diagnostic.session_capability.status.session_established": "Session established",
"jvm_diagnostic.session_capability.title": "Session and capabilities",
- "jvm_diagnostic.session.default_reason": "Session started from the console",
- "jvm_diagnostic.session.default_title": "JVM diagnostic console",
"jvm_diagnostic.workbench.action.cancel_command": "Cancel command",
"jvm_diagnostic.workbench.action.execute_command": "Execute command",
"jvm_diagnostic.workbench.action.probe": "Check capabilities",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "Resource value",
"jvm_resource.section.supported_actions": "Supported resource actions",
"jvm_resource.title": "JVM Resource Workbench",
- "jvm.backend.capability.reason.read_only": "Current connection is read-only",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "Enter a full http:// or https:// URL, for example http://127.0.0.1:19090/gonavi/agent/jvm.",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent connection failed: Agent Base URL is invalid.",
- "jvm.backend.connection_error.agent.base_url_required": "Agent connection failed: Agent Base URL is missing.",
- "jvm.backend.connection_error.agent.connection_refused.help": "Confirm the Java service started GoNavi Agent with `-javaagent`, and check Base URL, port mapping, and firewall rules.",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Agent connection failed: the target Agent management port is not listening, or the address is unreachable.",
- "jvm.backend.connection_error.agent.forbidden.help": "Confirm that client source, authentication settings, and Agent access policy allow GoNavi to access it.",
- "jvm.backend.connection_error.agent.forbidden.summary": "Agent connection failed: Agent rejected this request.",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "Change Agent Base URL to an address that starts with http:// or https://.",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent connection failed: only HTTP or HTTPS is supported.",
- "jvm.backend.connection_error.agent.timeout.help": "Confirm the target address is reachable, the Agent has started, and increase the connection timeout if needed.",
- "jvm.backend.connection_error.agent.timeout.summary": "Agent connection failed: timed out while accessing the Agent management port.",
- "jvm.backend.connection_error.agent.unauthorized.help": "Check whether the Agent API Key in the connection matches the target service startup parameters.",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Agent connection failed: Agent responded, but the API Key is missing or invalid.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Enter a full http:// or https:// URL that points to the management API root implementing the GoNavi JVM HTTP contract, for example http://127.0.0.1:19090/manage/jvm.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint connection failed: Endpoint Base URL is invalid.",
- "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint connection failed: Endpoint Base URL is missing.",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "Confirm that Base URL points to the management API implementing the GoNavi JVM HTTP contract, and check service listening, port mapping, and firewall rules.",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint connection failed: the target management API is not listening, or the address is unreachable.",
- "jvm.backend.connection_error.endpoint.forbidden.help": "Confirm that client source, authentication settings, and access policy allow GoNavi to access this management API.",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint connection failed: the target management API rejected this request.",
- "jvm.backend.connection_error.endpoint.not_found.help": "Confirm that Base URL points to the JVM management API root, not a business endpoint, health check, or gateway home page.",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint connection failed: the target responded, but the GoNavi JVM management API was not found.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Change Endpoint Base URL to an address that starts with http:// or https://.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint connection failed: only HTTP or HTTPS is supported.",
- "jvm.backend.connection_error.endpoint.timeout.help": "Confirm Base URL is reachable, the target service has started, and increase the connection timeout if needed.",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint connection failed: timed out while accessing the target management API.",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "Check whether the Endpoint API Key in the connection matches the target service configuration.",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint connection failed: the target management API responded, but the API Key is missing or invalid.",
- "jvm.backend.connection_error.generic": "JVM connection failed",
- "jvm.backend.connection_error.jmx.auth.help": "Confirm whether target JMX disables authentication. If authentication is required, provide username and password before connecting.",
- "jvm.backend.connection_error.jmx.auth.summary": "JMX connection failed: {{target}} requires authentication, or the current credentials are invalid.",
- "jvm.backend.connection_error.jmx.connection_refused.help": "Confirm remote JMX is enabled on the target JVM, and check host, firewall, port mapping, SSH, and proxy settings.",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX connection failed: cannot connect to {{target}} because the port is not listening or the network is unreachable.",
- "jvm.backend.connection_error.jmx.connection_reset.help": "Confirm the configured port is the JVM's exposed JMX port, not a business port, debug port, or proxied port.",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX connection failed: the service on {{target}} closed the connection; the port is not a compatible standard JMX RMI port.",
- "jvm.backend.connection_error.jmx.host_required": "JMX connection failed: host is missing.",
- "jvm.backend.connection_error.jmx.java_missing.help": "Install JRE/JDK first, or point the GONAVI_JMX_JAVA_BIN environment variable to the correct `java` executable.",
- "jvm.backend.connection_error.jmx.java_missing.summary": "JMX connection failed: the current machine cannot find the `java` runtime, so GoNavi cannot start the JMX helper.",
- "jvm.backend.connection_error.jmx.no_such_object.help": "This usually means the port is an RMI registry, debug port, or another Java service port. Check the `jmxremote.port` and `jmxremote.rmi.port` settings.",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX connection failed: {{target}} has an RMI service, but it is not a usable JMX RMIServer port.",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "Use the actual JMX port exposed by the application, not the business `server.port`. If the service only enables `-Dcom.sun.management.jmxremote` without `jmxremote.port`, it cannot be connected remotely.",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX connection failed: {{target}} is not a standard JMX remote management port; it looks like a business or HTTP port.",
- "jvm.backend.connection_error.jmx.port_invalid": "JMX connection failed: port is invalid. Enter a valid port from 1 to 65535.",
- "jvm.backend.connection_error.jmx.timeout.help": "Confirm the port is reachable, the network is not blocked, and increase the connection timeout if needed.",
- "jvm.backend.connection_error.jmx.timeout.summary": "JMX connection failed: connection to {{target}} timed out.",
- "jvm.backend.connection_error.suggestion": "Suggestion: {{detail}}",
- "jvm.backend.connection_error.technical_detail": "Technical detail: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel address is invalid: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel address is required",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "The active command in this Arthas Tunnel session does not match the command to cancel.",
- "jvm.backend.diagnostic.arthas.command_already_running": "This Arthas Tunnel session already has a running command. Wait for it to finish or cancel it first.",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel command was canceled",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel command timed out after {{timeout}}",
- "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket connection was canceled",
- "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket connection failed: {{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket connection timed out after {{timeout}} without a response",
- "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel connection closed: {{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel connection closed: code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel connection is not ready. Try again later.",
- "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel connection failed: HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "This Arthas Tunnel session has no running command.",
- "jvm.backend.diagnostic.arthas.read_canceled": "Reading Arthas Tunnel output was canceled",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Failed to set Arthas Tunnel read deadline: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "Failed to read Arthas Tunnel output: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "Reading Arthas Tunnel output timed out after {{timeout}} without a response",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Failed to encode Arthas Tunnel request: {{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel only supports http/https/ws/wss addresses: {{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "Sending the Arthas Tunnel terminal command was canceled",
- "jvm.backend.diagnostic.arthas.send_failed": "Failed to send Arthas Tunnel terminal command: {{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "Sending the Arthas Tunnel terminal command timed out after {{timeout}} without a response",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel session configuration changed. Create the diagnostic session again.",
- "jvm.backend.diagnostic.arthas.session_missing": "Diagnostic session does not exist. Create the Arthas Tunnel session again.",
- "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel target ID is required (targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "Target instance was not found. Check targetId / agentId and make sure the tunnel client is online.",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Target instance {{target}} was not found. Check targetId / agentId and make sure the tunnel client is online.",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Failed to encode Arthas Tunnel terminal command: {{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Failed to set Arthas Tunnel write deadline: {{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "Failed to write diagnostic audit record, command execution was blocked: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "Cancel command requires sessionId and commandId",
- "jvm.backend.diagnostic.error.command_required": "Diagnostic command cannot be empty",
- "jvm.backend.diagnostic.error.disabled": "JVM diagnostic enhancement is not enabled for this connection",
- "jvm.backend.diagnostic.error.execute_canceled": "Diagnostic execute request was canceled: {{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "Diagnostic session ID is required. Create a session first.",
- "jvm.backend.diagnostic.error.transport_unsupported": "Unsupported JVM diagnostic transport: {{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas command canceled",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas command completed",
- "jvm.backend.diagnostic.message.cancel_requested": "Cancel request sent; waiting for the diagnostic bridge to stop the command",
- "jvm.backend.diagnostic.message.command_completed": "Diagnostic command completed",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnostic command does not support newlines or multiple commands",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "High-risk diagnostic commands are not enabled for this connection: {{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe diagnostic commands are not enabled for this connection: {{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "Current connection is read-only. Only observe diagnostic commands are allowed",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace diagnostic commands are not enabled for this connection: {{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "Failed to write audit record: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "Failed to write audit record, JVM change was blocked: {{detail}}",
- "jvm.backend.error.change_action_required": "JVM change action is required",
- "jvm.backend.error.change_blocked_by_guard": "The current change was blocked by Guard",
- "jvm.backend.error.change_blocked_read_only": "Current connection is read-only, so writes are blocked",
- "jvm.backend.error.change_confirmation_token_failed": "Failed to generate JVM change confirmation token: {{detail}}",
- "jvm.backend.error.change_reason_required": "JVM change reason is required",
- "jvm.backend.error.change_resource_id_required": "JVM resource ID is required",
- "jvm.backend.error.confirmation_token_expired": "Confirmation token expired. Preview and confirm again.",
- "jvm.backend.error.confirmation_token_invalid": "Confirmation token is invalid. Preview and confirm again.",
- "jvm.backend.error.confirmation_token_missing": "Confirmation token is missing. Complete preview confirmation first.",
- "jvm.backend.error.disallowed_mode": "Current connection does not allow {{mode}} mode",
- "jvm.backend.error.preview_confirmation_missing": "Preview confirmation token is missing. Preview again before submitting.",
- "jvm.backend.error.preview_context_hash_failed": "Failed to generate JVM preview context: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "Failed to generate JVM preview payload digest: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "Invalid JVM resource path: {{detail}}",
- "jvm.backend.message.connect_success": "JVM connection succeeded",
- "jvm.backend.monitoring.error.session_not_found": "Monitoring session not found for {{connectionId}} {{providerMode}}",
- "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} monitoring snapshot is not supported yet",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "Monitoring sampling failed {{count}} consecutive times and this session was stopped automatically",
- "jvm.backend.separator.message_warning": "; ",
- "jvm.backend.warning.failed_audit_write_failed": "Failed to write failure audit record: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "Failed to write terminal audit record: {{detail}}",
"log_panel.action.clear": "Clear logs",
"log_panel.action.close": "Close panel",
"log_panel.affected_rows": "Affected: {{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "No SQL execution logs",
"log_panel.short_title": "Logs",
"log_panel.title": "SQL execution log",
- "message_publish_modal.action.send": "Send",
- "message_publish_modal.error.build_command_failed": "Failed to build the publish command",
- "message_publish_modal.error.send_failed_detail": "Send failed: {{detail}}",
- "message_publish_modal.error.unknown_error": "Unknown error",
- "message_publish_modal.field.body_mode.label": "Message body type",
- "message_publish_modal.field.body.extra": "JSON mode requires valid JSON. Text mode sends the content as-is.",
- "message_publish_modal.field.body.label": "Message body",
- "message_publish_modal.field.body.placeholder": "Enter the message body",
- "message_publish_modal.field.body.required": "Enter the message body",
- "message_publish_modal.field.delay_level.extra": "RocketMQ uses fixed delay levels. 0 sends immediately.",
- "message_publish_modal.field.delay_level.label": "Delay Level (optional)",
- "message_publish_modal.field.exchange.extra": "Leave empty to use the default exchange. If you enter a custom exchange, make sure the target Queue has a binding.",
- "message_publish_modal.field.exchange.label": "Exchange (optional)",
- "message_publish_modal.field.exchange.placeholder": "Example: events.topic",
- "message_publish_modal.field.headers.extra": "Must be a JSON object, for example {{example}}.",
- "message_publish_modal.field.headers.label": "Headers (optional)",
- "message_publish_modal.field.properties.extra": "Must be a JSON object, for example {{example}}.",
- "message_publish_modal.field.properties.label": "Properties (optional)",
- "message_publish_modal.field.qos.extra": "0 is at most once, 1 is at least once, and 2 is exactly once.",
- "message_publish_modal.field.retain.label": "Retain message",
- "message_publish_modal.field.routing_key.extra": "Leave empty to use the current Queue name by default.",
- "message_publish_modal.field.routing_key.label": "Routing Key (optional)",
- "message_publish_modal.field.routing_key.placeholder": "Example: orders.queue",
- "message_publish_modal.field.tag.extra": "Leave empty to skip filtering or writing a Tag.",
- "message_publish_modal.field.tag.label": "Tag (optional)",
- "message_publish_modal.footer.success_prefix": "A successful send returns",
- "message_publish_modal.footer.success_suffix": " to confirm whether this test message was submitted.",
- "message_publish_modal.option.no_delay": "No delay",
- "message_publish_modal.option.text": "Text",
- "message_publish_modal.title": "Test message publish",
- "message_publish_modal.title_with_connection": "Test message publish · {{connectionName}}",
"message_publish.error.destination_required": "Enter a target Topic / Queue",
"message_publish.error.invalid_json_detail": "{{field}} is not valid JSON: {{detail}}",
"message_publish.error.json_object_required": "{{field}} must be a JSON object",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag, Keys, Delay Level, and Properties are written into the RocketMQ message attributes.",
"message_publish.presentation.rocketmq.tag_placeholder": "Example: TagA",
"message_publish.presentation.topic_required": "Enter a Topic",
+ "message_publish_modal.action.send": "Send",
+ "message_publish_modal.error.build_command_failed": "Failed to build the publish command",
+ "message_publish_modal.error.send_failed_detail": "Send failed: {{detail}}",
+ "message_publish_modal.error.unknown_error": "Unknown error",
+ "message_publish_modal.field.body.extra": "JSON mode requires valid JSON. Text mode sends the content as-is.",
+ "message_publish_modal.field.body.label": "Message body",
+ "message_publish_modal.field.body.placeholder": "Enter the message body",
+ "message_publish_modal.field.body.required": "Enter the message body",
+ "message_publish_modal.field.body_mode.label": "Message body type",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ uses fixed delay levels. 0 sends immediately.",
+ "message_publish_modal.field.delay_level.label": "Delay Level (optional)",
+ "message_publish_modal.field.exchange.extra": "Leave empty to use the default exchange. If you enter a custom exchange, make sure the target Queue has a binding.",
+ "message_publish_modal.field.exchange.label": "Exchange (optional)",
+ "message_publish_modal.field.exchange.placeholder": "Example: events.topic",
+ "message_publish_modal.field.headers.extra": "Must be a JSON object, for example {{example}}.",
+ "message_publish_modal.field.headers.label": "Headers (optional)",
+ "message_publish_modal.field.properties.extra": "Must be a JSON object, for example {{example}}.",
+ "message_publish_modal.field.properties.label": "Properties (optional)",
+ "message_publish_modal.field.qos.extra": "0 is at most once, 1 is at least once, and 2 is exactly once.",
+ "message_publish_modal.field.retain.label": "Retain message",
+ "message_publish_modal.field.routing_key.extra": "Leave empty to use the current Queue name by default.",
+ "message_publish_modal.field.routing_key.label": "Routing Key (optional)",
+ "message_publish_modal.field.routing_key.placeholder": "Example: orders.queue",
+ "message_publish_modal.field.tag.extra": "Leave empty to skip filtering or writing a Tag.",
+ "message_publish_modal.field.tag.label": "Tag (optional)",
+ "message_publish_modal.footer.success_prefix": "A successful send returns",
+ "message_publish_modal.footer.success_suffix": " to confirm whether this test message was submitted.",
+ "message_publish_modal.option.no_delay": "No delay",
+ "message_publish_modal.option.text": "Text",
+ "message_publish_modal.title": "Test message publish",
+ "message_publish_modal.title_with_connection": "Test message publish · {{connectionName}}",
"proxy.backend.error.host_empty": "Proxy host is empty",
"proxy.backend.error.http_connect_failed": "Failed to connect to HTTP proxy: {{detail}}",
"proxy.backend.error.http_connect_read_failed": "Failed to read HTTP CONNECT response: {{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "SOCKS5 proxy connection failed: {{detail}}",
"proxy.backend.error.socks5_dialer_failed": "Failed to create SOCKS5 proxy dialer: {{detail}}",
"proxy.backend.error.unsupported_type": "Unsupported proxy type: {{type}}",
+ "query.format": "Format SQL",
+ "query.new": "New Query",
+ "query.run": "Run",
+ "query.save": "Save Query",
+ "query.stop": "Stop",
"query_editor.action.ai_explain_sql": "AI Explain SQL",
"query_editor.action.ai_explain_sql_menu": "Explain SQL",
"query_editor.action.ai_generate_sql": "AI Generate SQL",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "Schema analysis",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "Export SQL file",
- "query_editor.action.format": "Format",
"query_editor.action.find_in_editor": "Find",
"query_editor.action.find_in_editor_with_shortcut": "Find in editor ({{shortcut}})",
+ "query_editor.action.format": "Format",
"query_editor.action.format_sql": "Format SQL",
"query_editor.action.format_sql_with_shortcut": "Format SQL ({{shortcut}})",
"query_editor.action.hide_results_panel": "Hide results panel",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "Max rows: 5000",
"query_editor.max_rows.option_unlimited": "Max rows: unlimited",
"query_editor.max_rows.tooltip": "Maximum returned rows. SELECT statements get an automatic LIMIT to prevent very large result sets from freezing the UI.",
+ "query_editor.message.ai_model_missing": "The active AI provider has no model selected. Select a model in AI settings first.",
+ "query_editor.message.ai_provider_missing": "Configure and enable an AI provider in AI settings first.",
+ "query_editor.message.ai_service_unavailable": "The AI service is not ready. Try again later or check AI settings.",
"query_editor.message.append_success": "Code appended.",
"query_editor.message.cancel_failed": "Failed to cancel query: {{error}}",
"query_editor.message.cancel_no_running": "No running query to cancel.",
"query_editor.message.cancel_success": "Query canceled.",
"query_editor.message.connection_not_found": "Connection not found.",
"query_editor.message.connection_readonly_blocked": "This connection has production guard enabled and only allows query operations.",
+ "query_editor.message.current_line_no_copyable_content": "No copyable content on the current line.",
"query_editor.message.execution_failed_with_error": "Query execution failed: {{error}}",
"query_editor.message.execution_multi_success": "Executed {{statements}} statements and produced {{results}} result sets.",
"query_editor.message.execution_result_sets_success": "Execution finished and produced {{results}} result sets.",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "Format failed: SQL syntax may be invalid.",
"query_editor.message.format_restore_success": "Restored the pre-format SQL snapshot.",
"query_editor.message.insert_success": "Code inserted at the current cursor.",
- "query_editor.message.ai_model_missing": "The active AI provider has no model selected. Select a model in AI settings first.",
- "query_editor.message.ai_provider_missing": "Configure and enable an AI provider in AI settings first.",
- "query_editor.message.ai_service_unavailable": "The AI service is not ready. Try again later or check AI settings.",
"query_editor.message.no_executable_sql": "No executable SQL.",
"query_editor.message.no_format_restore_snapshot": "No pre-format SQL snapshot is available to restore.",
- "query_editor.message.current_line_no_copyable_content": "No copyable content on the current line.",
"query_editor.message.no_selectable_sql": "No selectable SQL statement.",
"query_editor.message.object_info_target_not_found": "The cursor is not on a recognized table or column.",
"query_editor.message.page_query_empty": "The page query returned no result set.",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "Result {{index}} ✓",
"query_editor.results_panel.action.hide": "Hide",
"query_editor.results_panel.aria.hide": "Hide results panel",
+ "query_editor.results_panel.detached.close": "Close window",
+ "query_editor.results_panel.detached.restore": "Restore as result tab",
+ "query_editor.results_panel.detached.title": "Result {{index}}",
"query_editor.results_panel.menu.close_all": "Close all tabs",
"query_editor.results_panel.menu.close_left": "Close tabs to the left",
"query_editor.results_panel.menu.close_other": "Close other tabs",
"query_editor.results_panel.menu.close_right": "Close tabs to the right",
+ "query_editor.results_panel.menu.open_in_window": "Open in floating window",
+ "query_editor.results_panel.menu.restore_to_tab": "Restore as result tab",
"query_editor.results_panel.message.action.copy": "Copy",
"query_editor.results_panel.message.copy_failed": "Failed to copy message: {{detail}}",
"query_editor.results_panel.message.copy_unsupported": "Clipboard is not available in the current environment",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "Rename query",
"query_editor.save_modal.title": "Save query",
"query_editor.save_modal.unnamed": "Untitled query",
- "query_editor.snippet_picker.description": "Choose an existing SQL snippet and insert it at the current cursor position.",
- "query_editor.snippet_picker.empty": "No SQL snippets are available yet. Open snippet settings to add or restore snippets.",
- "query_editor.snippet_picker.empty_filtered": "No SQL snippets match the current filter.",
- "query_editor.snippet_picker.manage": "Manage snippets",
- "query_editor.snippet_picker.search_placeholder": "Search by prefix, name, or content",
- "query_editor.snippet_picker.title": "Insert SQL Snippet",
"query_editor.slash_command.diff.description": "Compare table differences and generate changes",
"query_editor.slash_command.diff.label": "Table comparison",
"query_editor.slash_command.diff.prompt": "Compare these two table structures and generate ALTER statements to migrate from the old version to the new version.",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "Describe the requirement and generate a statement",
"query_editor.slash_command.sql.label": "Generate SQL",
"query_editor.slash_command.sql.prompt": "Generate SQL for this requirement:",
- "query_editor.text_to_sql.description": "Describe the data you want to query or change. GoNavi will use the current connection, database, and loaded schema to generate SQL.",
- "query_editor.text_to_sql.generate": "Generate SQL",
- "query_editor.text_to_sql.mode.insert": "Insert at cursor",
- "query_editor.text_to_sql.mode.replace_all": "Replace all",
- "query_editor.text_to_sql.mode.replace_selection": "Replace selection",
- "query_editor.text_to_sql.placeholder": "Example: summarize daily order amount for the last 30 days and sort by date ascending",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "Choose an existing SQL snippet and insert it at the current cursor position.",
+ "query_editor.snippet_picker.empty": "No SQL snippets are available yet. Open snippet settings to add or restore snippets.",
+ "query_editor.snippet_picker.empty_filtered": "No SQL snippets match the current filter.",
+ "query_editor.snippet_picker.manage": "Manage snippets",
+ "query_editor.snippet_picker.search_placeholder": "Search by prefix, name, or content",
+ "query_editor.snippet_picker.title": "Insert SQL Snippet",
"query_editor.sql_error.rule.column_missing.explanation": "The SQL references a column that is not in the result set, is spelled differently, or does not exist on the current table.",
"query_editor.sql_error.rule.column_missing.label": "Column does not exist",
"query_editor.sql_error.rule.column_missing.suggestion": "Check column names, aliases, casing, table aliases, and whether the column belongs to the current FROM/JOIN object.",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "Raw error: {{error}}",
"query_editor.sql_error.wrapper.semantic_line": "Semantic meaning: {{label}}. {{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "Suggestion: {{suggestion}}",
+ "query_editor.text_to_sql.description": "Describe the data you want to query or change. GoNavi will use the current connection, database, and loaded schema to generate SQL.",
+ "query_editor.text_to_sql.generate": "Generate SQL",
+ "query_editor.text_to_sql.mode.insert": "Insert at cursor",
+ "query_editor.text_to_sql.mode.replace_all": "Replace all",
+ "query_editor.text_to_sql.mode.replace_selection": "Replace selection",
+ "query_editor.text_to_sql.placeholder": "Example: summarize daily order amount for the last 30 days and sort by date ascending",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "Commit",
"query_editor.transaction.action.commit_with_count": "Commit ({{count}})",
"query_editor.transaction.action.rollback": "Rollback",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "Unable to parse the connection fingerprint",
"query_history.backend.message.cleared": "Slow query history cleared",
"query_history.backend.message.loaded": "Loaded",
- "query.format": "Format SQL",
- "query.new": "New Query",
- "query.run": "Run",
- "query.save": "Save Query",
- "query.stop": "Stop",
+ "redis.backend.error.address_required": "Redis connection address cannot be empty",
+ "redis.backend.error.argument_invalid_type": "{{name}} has an invalid type",
+ "redis.backend.error.argument_required": "{{name}} is required",
+ "redis.backend.error.cluster_connect_failed": "Redis Cluster connection failed: {{detail}}",
+ "redis.backend.error.command_required": "Command cannot be empty",
+ "redis.backend.error.connect_attempt_failed": "Attempt {{attempt}} connection failed: {{detail}}",
+ "redis.backend.error.connect_failed": "Redis connection failed: {{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "Attempt {{attempt}} TLS setup failed: {{detail}}",
+ "redis.backend.error.export_no_keys": "No Keys matched the export scope",
+ "redis.backend.error.import_no_keys_selected": "No Keys were selected for import",
+ "redis.backend.error.import_payload_invalid": "Redis import file is invalid: {{detail}}",
+ "redis.backend.error.invalid_node_address": "Invalid Redis node address: {{address}}",
+ "redis.backend.error.invalid_port": "Invalid Redis port: {{address}}",
+ "redis.backend.error.node_address_required": "Redis node address cannot be empty",
+ "redis.backend.error.select_db_index_invalid": "Invalid database index: {{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "Database index must be between {{min}} and {{max}}",
+ "redis.backend.error.select_db_index_required": "SELECT command requires a database index",
+ "redis.backend.error.sentinel_connect_failed": "Redis Sentinel connection failed: {{detail}}",
+ "redis.backend.error.sentinel_master_required": "Redis Sentinel mode requires a master name",
+ "redis.backend.error.ssh_tunnel_create_failed": "Failed to create the SSH tunnel: {{detail}}",
+ "redis.backend.error.test_connection_close_failed": "Connection succeeded, but releasing the test connection failed: {{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}} mode does not support SSH tunnels yet. Disable SSH and try again.",
+ "redis.backend.label.topology_cluster": "Cluster",
+ "redis.backend.label.topology_multi_node": "multi-node",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "Add succeeded",
+ "redis.backend.message.connect_success": "Connection succeeded",
+ "redis.backend.message.delete_success": "Delete succeeded",
+ "redis.backend.message.export_success": "Export succeeded",
+ "redis.backend.message.flush_success": "Flush succeeded",
+ "redis.backend.message.import_success": "Import succeeded",
+ "redis.backend.message.rename_success": "Rename succeeded",
+ "redis.backend.message.select_db_success": "Database switched",
+ "redis.backend.message.set_success": "Set succeeded",
+ "redis.db_alias.menu.set": "Set alias",
+ "redis.db_alias.modal.placeholder": "e.g. cache, sessions (leave empty to clear)",
+ "redis.db_alias.modal.title": "Alias for {{db}}",
"redis_command.action.clear_console": "Clear console",
"redis_command.action.execute": "Run (Cmd+Enter)",
"redis_command.completion.detail": "Redis command",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "Push to tail",
"redis_viewer.action.add_member": "Add member",
"redis_viewer.action.add_stream_entry": "Add entry",
+ "redis_viewer.action.change_import_file": "Change import file",
"redis_viewer.action.clear_group_selection": "Clear selection",
"redis_viewer.action.clear_selection": "Clear selection",
"redis_viewer.action.copy": "Copy",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "Edit",
"redis_viewer.action.export_all": "Export all",
"redis_viewer.action.export_selected": "Export selected",
- "redis_viewer.action.change_import_file": "Change import file",
"redis_viewer.action.import": "Import",
"redis_viewer.action.load_all": "Load all",
"redis_viewer.action.load_more": "Load more",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "Refresh",
"redis_viewer.action.rename_key": "Rename Key",
"redis_viewer.action.select_all_import_keys": "Select all import Keys",
- "redis_viewer.action.select_import_file": "Select import file",
"redis_viewer.action.select_all_loaded": "Select all loaded",
"redis_viewer.action.select_group": "Select",
+ "redis_viewer.action.select_import_file": "Select import file",
"redis_viewer.action.set_ttl": "Set TTL",
"redis_viewer.aria.collapse_group": "Collapse group",
"redis_viewer.aria.expand_group": "Expand group",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "Binary data cannot be edited",
"redis_viewer.hint.switch_auto_to_edit": "Switch to Auto mode to edit",
"redis_viewer.label.encoding": "Encoding: {{encoding}}",
+ "redis_viewer.label.import_database": "Source DB: db{{database}}",
+ "redis_viewer.label.import_selection": "Selected {{selected}} / {{total}} Keys",
"redis_viewer.label.keys_count": "Loaded {{count}} Keys",
"redis_viewer.label.length": "Length: {{count}}",
"redis_viewer.label.node_count": "{{count}} nodes",
- "redis_viewer.label.import_database": "Source DB: db{{database}}",
- "redis_viewer.label.import_selection": "Selected {{selected}} / {{total}} Keys",
"redis_viewer.label.original_key": "Original Key: {{key}}",
"redis_viewer.message.add_failed": "Add failed: {{detail}}",
"redis_viewer.message.add_success": "Added",
@@ -6596,15 +6638,15 @@
"redis_viewer.modal.add_stream_entry": "Add Stream entry",
"redis_viewer.modal.edit_field": "Edit field: {{field}}",
"redis_viewer.modal.edit_index": "Edit index {{index}}",
- "redis_viewer.modal.import_keys": "Import Redis Keys",
"redis_viewer.modal.edit_value": "Edit value",
+ "redis_viewer.modal.import_keys": "Import Redis Keys",
"redis_viewer.modal.new_key": "New Key",
"redis_viewer.modal.rename_key": "Rename Key",
"redis_viewer.modal.set_ttl": "Set TTL",
"redis_viewer.modal.update_score": "Update score",
+ "redis_viewer.notice.large_keyspace_mode": "Large keyspace performance mode is enabled. Node rendering is simplified and up to {{count}} expanded groups are kept.",
"redis_viewer.option.import_overwrite": "Overwrite existing Keys",
"redis_viewer.option.import_skip_existing": "Skip existing Keys",
- "redis_viewer.notice.large_keyspace_mode": "Large keyspace performance mode is enabled. Node rendering is simplified and up to {{count}} expanded groups are kept.",
"redis_viewer.placeholder.key_name": "Key name",
"redis_viewer.placeholder.member_value": "Enter member value",
"redis_viewer.placeholder.new_element_value": "Enter new element value",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "Raw text",
"redis_viewer.view.title": "View mode",
- "redis.backend.error.address_required": "Redis connection address cannot be empty",
- "redis.backend.error.argument_invalid_type": "{{name}} has an invalid type",
- "redis.backend.error.argument_required": "{{name}} is required",
- "redis.backend.error.cluster_connect_failed": "Redis Cluster connection failed: {{detail}}",
- "redis.backend.error.command_required": "Command cannot be empty",
- "redis.backend.error.connect_attempt_failed": "Attempt {{attempt}} connection failed: {{detail}}",
- "redis.backend.error.connect_failed": "Redis connection failed: {{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "Attempt {{attempt}} TLS setup failed: {{detail}}",
- "redis.backend.error.export_no_keys": "No Keys matched the export scope",
- "redis.backend.error.import_no_keys_selected": "No Keys were selected for import",
- "redis.backend.error.import_payload_invalid": "Redis import file is invalid: {{detail}}",
- "redis.backend.error.invalid_node_address": "Invalid Redis node address: {{address}}",
- "redis.backend.error.invalid_port": "Invalid Redis port: {{address}}",
- "redis.backend.error.node_address_required": "Redis node address cannot be empty",
- "redis.backend.error.select_db_index_invalid": "Invalid database index: {{value}}",
- "redis.backend.error.select_db_index_out_of_range": "Database index must be between {{min}} and {{max}}",
- "redis.backend.error.select_db_index_required": "SELECT command requires a database index",
- "redis.backend.error.sentinel_connect_failed": "Redis Sentinel connection failed: {{detail}}",
- "redis.backend.error.sentinel_master_required": "Redis Sentinel mode requires a master name",
- "redis.backend.error.ssh_tunnel_create_failed": "Failed to create the SSH tunnel: {{detail}}",
- "redis.backend.error.test_connection_close_failed": "Connection succeeded, but releasing the test connection failed: {{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}} mode does not support SSH tunnels yet. Disable SSH and try again.",
- "redis.backend.label.topology_cluster": "Cluster",
- "redis.backend.label.topology_multi_node": "multi-node",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "Add succeeded",
- "redis.backend.message.connect_success": "Connection succeeded",
- "redis.backend.message.delete_success": "Delete succeeded",
- "redis.backend.message.export_success": "Export succeeded",
- "redis.backend.message.flush_success": "Flush succeeded",
- "redis.backend.message.import_success": "Import succeeded",
- "redis.backend.message.rename_success": "Rename succeeded",
- "redis.backend.message.select_db_success": "Database switched",
- "redis.backend.message.set_success": "Set succeeded",
- "redis.db_alias.menu.set": "Set alias",
- "redis.db_alias.modal.placeholder": "e.g. cache, sessions (leave empty to clear)",
- "redis.db_alias.modal.title": "Alias for {{db}}",
"saved_query.default_name": "Query {{index}}",
"saved_query.error.missing_context": "Saved query is missing SQL, connection, or database context",
"security_update.action.open_ai_settings": "AI Settings",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "Generate 3 common SQL queries for table {{table}}.",
"sidebar.aria.switch_connection": "Switch to connection {{name}}",
"sidebar.badge.recommended": "Recommended",
- "sidebar.batch_databases": "Batch database operations",
- "sidebar.batch_tables": "Batch table operations",
"sidebar.batch.filtered_count": "Filtered {{filtered}} / {{total}} objects",
"sidebar.batch.group.tables": "Tables",
"sidebar.batch.group.views": "Views",
"sidebar.batch.no_matching_objects": "No matching objects",
"sidebar.batch.selected_databases": "Selected {{selected}} / {{total}} databases",
"sidebar.batch.selected_objects": "Selected {{selected}} / {{total}} objects",
+ "sidebar.batch_databases": "Batch database operations",
+ "sidebar.batch_tables": "Batch table operations",
"sidebar.command_search.action.ask_ai.title": "Ask AI",
"sidebar.command_search.action.new_connection.meta": "Create a database, runtime, or other data source connection",
"sidebar.command_search.action.new_connection.title": "New data source",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "Table name",
"sidebar.copy_object_name.label.view": "View name",
"sidebar.error.unknown": "Unknown error",
+ "sidebar.external_sql.directory_fallback": "SQL directory",
+ "sidebar.external_sql.root": "External SQL files",
"sidebar.external_sql_modal.action.create": "Create",
"sidebar.external_sql_modal.action.rename": "Rename",
"sidebar.external_sql_modal.field.directory_name": "Directory name",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "Enter a directory name",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "File name cannot contain path separators",
"sidebar.external_sql_modal.validation.sql_file_name_required": "Enter a SQL file name",
- "sidebar.external_sql.directory_fallback": "SQL directory",
- "sidebar.external_sql.root": "External SQL files",
"sidebar.field.database_name": "Database name",
"sidebar.field.new_database_name": "Replacement database name",
"sidebar.field.new_table_name": "Replacement table name",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "Select at least one database.",
"sidebar.message.select_host_before_large_sql_file": "Select a Host before running a large SQL file.",
"sidebar.message.select_object_required": "Select at least one object.",
- "sidebar.message.select_table_required": "Select at least one table.",
"sidebar.message.select_sql_directory_failed": "Failed to select SQL directory: {{error}}",
+ "sidebar.message.select_table_required": "Select at least one table.",
"sidebar.message.sidebar_filter_reset": "Sidebar filter reset.",
"sidebar.message.sidebar_filter_sync_disabled": "Left-side filter sync disabled.",
"sidebar.message.sidebar_filter_sync_enabled": "Left-side filter sync enabled.",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "Batch object operations",
"sidebar.modal.confirm_clear_selected_tables.content": "Clear data in selected objects under {{connection}} / {{database}}? This cannot be undone.",
"sidebar.modal.confirm_clear_selected_tables.title": "Confirm clear selected tables",
- "sidebar.modal.confirm_delete_selected_databases.content": "Delete {{count}} selected databases under {{connection}}? This cannot be undone.",
- "sidebar.modal.confirm_delete_selected_databases.title": "Confirm delete selected databases",
- "sidebar.modal.confirm_delete_selected_tables.content": "Delete {{count}} selected tables under {{connection}} / {{database}}? This cannot be undone.",
- "sidebar.modal.confirm_delete_selected_tables.title": "Confirm delete selected tables",
+ "sidebar.modal.confirm_delete.title": "Confirm delete",
"sidebar.modal.confirm_delete_connection.content": "Delete {{name}}?",
"sidebar.modal.confirm_delete_database.content": "Delete {{name}}? This cannot be undone.",
"sidebar.modal.confirm_delete_database.title": "Delete database",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "Delete saved query \"{{name}}\"? This action cannot be undone.",
"sidebar.modal.confirm_delete_schema.content": "Delete schema {{name}}? The schema and all objects inside it will be deleted. This cannot be undone.",
"sidebar.modal.confirm_delete_schema.title": "Delete schema",
+ "sidebar.modal.confirm_delete_selected_databases.content": "Delete {{count}} selected databases under {{connection}}? This cannot be undone.",
+ "sidebar.modal.confirm_delete_selected_databases.title": "Confirm delete selected databases",
+ "sidebar.modal.confirm_delete_selected_tables.content": "Delete {{count}} selected tables under {{connection}} / {{database}}? This cannot be undone.",
+ "sidebar.modal.confirm_delete_selected_tables.title": "Confirm delete selected tables",
"sidebar.modal.confirm_delete_sql_directory.content": "Delete \"{{name}}\"? This will delete the local directory from disk, and only empty directories can be deleted.",
"sidebar.modal.confirm_delete_sql_directory.title": "Delete SQL directory",
"sidebar.modal.confirm_delete_sql_file.content": "Delete \"{{name}}\"? This will delete the local file from disk and cannot be undone.",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "Delete group \"{{name}}\"? This will not delete the connections inside it.",
"sidebar.modal.confirm_delete_view.content": "Delete {{name}}? This cannot be undone.",
"sidebar.modal.confirm_delete_view.title": "Delete view",
- "sidebar.modal.confirm_delete.title": "Confirm delete",
"sidebar.modal.confirm_table_data_action.content": "{{action}} {{table}}? This cannot be undone.",
"sidebar.modal.confirm_table_data_action.title": "Confirm {{action}}",
"sidebar.modal.create_database.title": "Create database",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "New group",
"sidebar.modal.tag.edit_description": "Update the group name and included connections.",
"sidebar.modal.tag.edit_title": "Edit group",
+ "sidebar.object.function": "Function",
+ "sidebar.object.procedure": "Procedure",
+ "sidebar.object.view": "View",
"sidebar.object_group.events": "Events",
"sidebar.object_group.materialized_views": "Materialized views",
"sidebar.object_group.packages": "Packages",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "Tables",
"sidebar.object_group.triggers": "Triggers",
"sidebar.object_group.views": "Views",
- "sidebar.object.function": "Function",
- "sidebar.object.procedure": "Procedure",
- "sidebar.object.view": "View",
"sidebar.placeholder.filter_table_view": "Filter tables and views",
"sidebar.placeholder.select_connection": "Select connection",
"sidebar.placeholder.select_connection_first": "Select a connection first",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "Manual scope",
"sidebar.search.multi_select_supported": "Multiple scopes supported",
"sidebar.search.placeholder": "Search...",
- "sidebar.search.scope_description": "Choose where the sidebar search should match.",
- "sidebar.search.scope_hint": "Smart mode searches names, hosts, databases, and objects according to context.",
- "sidebar.search.scope_title": "Search scope",
- "sidebar.search.scope_tooltip": "Current search scope: {{scope}}",
"sidebar.search.scope.database": "Database",
"sidebar.search.scope.host": "Host",
"sidebar.search.scope.object": "Object",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "Automatically narrows search based on the selected node.",
"sidebar.search.scope.smart_short": "Smart",
"sidebar.search.scope.tag": "Tag",
+ "sidebar.search.scope_description": "Choose where the sidebar search should match.",
+ "sidebar.search.scope_hint": "Smart mode searches names, hosts, databases, and objects according to context.",
+ "sidebar.search.scope_title": "Search scope",
+ "sidebar.search.scope_tooltip": "Current search scope: {{scope}}",
"sidebar.sql_directory.default_name": "SQL directory",
+ "sidebar.sql_file.default_name": "SQL file",
"sidebar.sql_file_exec.cancel": "Cancel execution",
"sidebar.sql_file_exec.executed_label": "Executed: ",
"sidebar.sql_file_exec.file_size": "File size: ",
+ "sidebar.sql_file_exec.message.already_running": "An external SQL execution task is already running",
"sidebar.sql_file_exec.rows_separator": " rows | Failed: ",
"sidebar.sql_file_exec.rows_suffix": " rows",
- "sidebar.sql_file_exec.status_label": "Status: ",
"sidebar.sql_file_exec.status.cancelled": "Cancelled",
"sidebar.sql_file_exec.status.done": "Done",
"sidebar.sql_file_exec.status.error": "Error",
"sidebar.sql_file_exec.status.running": "Running",
+ "sidebar.sql_file_exec.status_label": "Status: ",
"sidebar.sql_file_exec.title": "Run external SQL file",
- "sidebar.sql_file_exec.message.already_running": "An external SQL execution task is already running",
"sidebar.sql_file_exec.workbench.action.clear_history": "Clear history",
"sidebar.sql_file_exec.workbench.action.run_again": "Run again",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "No execution is running yet. Once a file is selected, progress will stay visible here.",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "Started at",
"sidebar.sql_file_exec.workbench.section.config": "Execution config",
"sidebar.sql_file_exec.workbench.stage.preparing": "Preparing execution",
- "sidebar.sql_file.default_name": "SQL file",
"sidebar.sql_template.duckdb_macro_hint": "Use SQL Macro for function-like behavior",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB does not support stored procedures yet",
"sidebar.sql_template.edit_routine": "Edit {{type}} {{name}}",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "Export current schema table structures · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · Schema actions",
"sidebar.v2_table_group_menu.current_database": "Current database",
- "sidebar.v2_table_group_menu.display_section": "Display",
"sidebar.v2_table_group_menu.display_create_time": "Show created time",
+ "sidebar.v2_table_group_menu.display_section": "Display",
"sidebar.v2_table_group_menu.display_table_rows": "Show row counts",
"sidebar.v2_table_group_menu.display_table_size": "Show table size",
"sidebar.v2_table_group_menu.display_update_time": "Show updated time",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "Diagnosis only supports SELECT / WITH queries. Use EXPLAIN PLAN mode for write operations (PR2 support).",
"sql_analysis.backend.error.unsupported_db_type": "The current data source ({{dbType}}) does not support SQL diagnosis yet. Phase 1 supports MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase.",
"sql_analysis.backend.message.completed": "Diagnosis completed",
- "sql_analysis.explain_graph.flag.filesort": "Filesort",
- "sql_analysis.explain_graph.flag.full_scan": "Full scan",
- "sql_analysis.explain_graph.flag.temp_table": "Temp table",
- "sql_analysis.explain_graph.label.index": "Index: ",
- "sql_analysis.explain_graph.label.table": "Table: ",
- "sql_analysis.explain_graph.metric.actual_rows": "Actual",
- "sql_analysis.explain_graph.metric.cost": "Cost",
- "sql_analysis.explain_graph.metric.est_rows": "Est.",
"sql_analysis.explain.empty": "Enter SQL and run diagnosis",
"sql_analysis.explain.error.query_required": "SQL statement is empty",
"sql_analysis.explain.error.run_failed": "Diagnosis failed",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(no raw output)",
"sql_analysis.explain.view.plan": "Execution plan",
"sql_analysis.explain.view.raw": "Raw",
+ "sql_analysis.explain_graph.flag.filesort": "Filesort",
+ "sql_analysis.explain_graph.flag.full_scan": "Full scan",
+ "sql_analysis.explain_graph.flag.temp_table": "Temp table",
+ "sql_analysis.explain_graph.label.index": "Index: ",
+ "sql_analysis.explain_graph.label.table": "Table: ",
+ "sql_analysis.explain_graph.metric.actual_rows": "Actual",
+ "sql_analysis.explain_graph.metric.cost": "Cost",
+ "sql_analysis.explain_graph.metric.est_rows": "Est.",
"sql_analysis.sidebar.node.actual_rows": "Actual rows",
"sql_analysis.sidebar.node.buffer_hit": "Buffer hit",
"sql_analysis.sidebar.node.cost": "Cost",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "Tag {{index}}",
"store.fallback.sql_snippet_name": "Snippet {{index}}",
"tab_manager.close_aria": "Close {{title}}",
+ "tab_manager.detached.close": "Close window",
+ "tab_manager.detached.restore": "Restore as tab",
+ "tab_manager.detached.title_fallback": "Floating window",
"tab_manager.empty.action.open_ai": "Open AI",
"tab_manager.empty.aria.start_workbench": "GoNavi start workbench",
"tab_manager.empty.eyebrow.connections": "{{count}} connections",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "Close tabs to the left",
"tab_manager.menu.close_other": "Close other tabs",
"tab_manager.menu.close_right": "Close tabs to the right",
+ "tab_manager.menu.open_in_window": "Open in floating window",
+ "tab_manager.menu.restore_to_tab": "Restore as tab",
"tab_manager.menu.tab_display_settings": "Tab settings",
"tab_manager.sql_file_close.close_tabs": "Close tabs",
"tab_manager.sql_file_close.continue_close": "Continue closing",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "Setup information expired. Refresh the page and try again.",
"web_auth.error.setup_required": "Web authentication setup is required",
"web_auth.error.setup_token_expired": "Setup token expired. Refresh the page and try again.",
- "web_auth.error.totp_code_required": "Enter a Google Authenticator code or a recovery code",
"web_auth.error.too_many_login_attempts": "Too many sign-in attempts. Try again later.",
+ "web_auth.error.totp_code_required": "Enter a Google Authenticator code or a recovery code",
"web_auth.page.login.code_label": "Google Authenticator code / recovery code",
"web_auth.page.login.code_placeholder": "6-digit code or recovery code",
"web_auth.page.login.description": "Browser sessions are managed on the server. Idle timeout, absolute timeout, and remember-me duration are enforced centrally.",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "Recovery codes are shown only once. Save them offline:",
"web_auth.page.setup.remember_label": "Remember sign-in (days)",
"web_auth.page.setup.secret_label": "Secret",
+ "web_auth.page.setup.session_title": "Session policy",
"web_auth.page.setup.step_admin_description": "Set the browser admin credential first",
"web_auth.page.setup.step_admin_hint": "Start by creating the admin password, then decide whether Google Authenticator 2FA should be enabled right away.",
"web_auth.page.setup.step_admin_title": "Create admin password",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "Bind TOTP by QR code or manual entry",
"web_auth.page.setup.step_totp_hint": "If 2FA is enabled, complete the authenticator binding here and confirm it with the first verification code.",
"web_auth.page.setup.step_totp_title": "Bind authenticator",
- "web_auth.page.setup.session_title": "Session policy",
"web_auth.page.setup.submit": "Complete setup and enter GoNavi",
"web_auth.page.setup.subtitle": "Create the admin password on first launch and bind Google Authenticator right away",
"web_auth.page.setup.title": "Initialize GoNavi Web",
diff --git a/shared/i18n/ja-JP.json b/shared/i18n/ja-JP.json
index ac1f04a2..ca37f4e8 100644
--- a/shared/i18n/ja-JP.json
+++ b/shared/i18n/ja-JP.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "Claude Code 設定ディレクトリの作成に失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 設定の形式が正しくありません: {{path}} は {{expected}} である必要があります",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "Claude Code 設定の解析に失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "Claude Code 設定の場所を特定できませんでした: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "Claude Code 設定の読み取りに失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "Claude Code 設定のシリアライズに失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "Claude Code 設定の書き込みに失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "Claude Code のユーザーレベル MCP 設定を書き込みました。Claude CLI を再起動すると、/mcp の User MCPs に GoNavi が表示されます。",
+ "ai.service.mcp_client.claude_code.status.connected": "Claude Code のユーザーレベル GoNavi MCP 設定が検出され、現在の GoNavi インストールパスと一致しています",
+ "ai.service.mcp_client.claude_code.status.missing": "Claude Code のユーザーレベル GoNavi MCP 設定は検出されませんでした",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "Claude Code 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスの確認に失敗しました: {{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "Claude Code 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスと一致しません。更新を推奨します。",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "Codex 設定ディレクトリの作成に失敗しました: {{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Codex 設定の形式が正しくありません: {{path}} を {{expected}} として解析できませんでした",
+ "ai.service.mcp_client.codex.config_path_failed": "Codex 設定の場所を特定できませんでした: {{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "Codex 設定の読み取りに失敗しました: {{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "Codex 設定の書き込みに失敗しました: {{detail}}",
+ "ai.service.mcp_client.codex.install_success": "Codex のユーザーレベル MCP 設定を書き込みました。Codex CLI またはデスクトップアプリを再起動すると GoNavi が表示されます。",
+ "ai.service.mcp_client.codex.status.connected": "Codex のユーザーレベル GoNavi MCP 設定が検出され、現在の GoNavi インストールパスと一致しています",
+ "ai.service.mcp_client.codex.status.missing": "Codex のユーザーレベル GoNavi MCP 設定は検出されませんでした",
+ "ai.service.mcp_client.codex.status.path_check_failed": "Codex 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスの確認に失敗しました: {{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "Codex 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスと一致しません。更新を推奨します。",
+ "ai.service.mcp_client.executable_path_empty": "現在の GoNavi 実行ファイルパスが空です",
+ "ai.service.mcp_client.executable_path_failed": "現在の GoNavi 実行ファイルの場所を特定できませんでした: {{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} は通常クラウドまたはリモート環境で動作します。リモート MCP ブリッジ経由で Windows GoNavi に接続してください。データベースパスワードはこの GoNavi マシンに残ります。",
+ "ai.service.mcp_client.user_home_dir_unavailable": "現在のユーザーのホームディレクトリを特定できませんでした",
"ai_chat.builtin_tools.database.execute_sql.desc": "Execute a SQL query and return results",
"ai_chat.builtin_tools.database.execute_sql.detail": "Pass connectionId, dbName, and sql, then execute SQL on the target database and return results (up to 50 rows). Controlled by safety level; read-only mode only allows SELECT/SHOW/DESCRIBE.",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "Connection ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "新しいチャット",
"ai_chat.header.export_time": "エクスポート日時:",
"ai_chat.header.export_user": "あなた",
- "ai_chat.header.mode_tabs.aria_label": "AI 作業モード",
"ai_chat.header.mode.chat": "チャット",
"ai_chat.header.mode.history": "履歴",
"ai_chat.header.mode.insights": "自動インサイト",
+ "ai_chat.header.mode_tabs.aria_label": "AI 作業モード",
"ai_chat.header.session.connected": "{{title}} · 接続済み",
"ai_chat.header.tooltip.close": "パネルを閉じる",
"ai_chat.header.tooltip.export_markdown": "Markdown としてエクスポート",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "messageId と contentPreview を現在の会話と照合し、どのバブルがレンダリング異常を起こしたか特定してください。",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "さらに範囲を絞る必要がある場合は、最新のユーザー入力、ツール結果、関連コンポーネントコードを比較してください。",
"ai_chat.inspection.last_render_error.recorded_summary": "直近の AI メッセージレンダリング異常が記録されており、対象メッセージ、レンダリング経路、スタック要約の診断に利用できます。",
+ "ai_chat.inspection.mcp.message.configured": "{{serverCount}} 件の MCP サービスが設定され、{{enabledCount}} 件が有効です",
+ "ai_chat.inspection.mcp.message.empty": "MCP サービスはまだ設定されていません",
+ "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} 件の MCP サービスが設定され、{{enabledCount}} 件が有効です。{{issueCount}} 件の設定チェック項目に対応が必要です",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "まず MCP サービス設定エラーを修正してから、サービスを再テストしてください",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "影響を受ける MCP サービスを開き、設定チェックのヒントに従って起動コマンド、引数、タイムアウトを分けてください",
+ "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 件の MCP サービスに起動設定エラーがあり、テストとツール検出に失敗する可能性があります",
+ "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 件の MCP サービスに起動設定警告があります。ツール検出失敗を診断する前に確認してください",
"ai_chat.inspection.mcp_docker.message.empty": "現在 Docker MCP サービスはありません",
"ai_chat.inspection.mcp_docker.message.with_enabled": "現在 {{total}} 個の Docker MCP があり、そのうち {{enabled}} 個が有効です",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "現在 {{total}} 個の Docker MCP があり、そのうち {{count}} 個は重要な引数が不完整です",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "一部の MCP ツールは inputSchema を宣言していないため、パラメータ説明が不完全な可能性があります。",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "一致する MCP ツールが見つかりませんでした。",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "MCP ツールが検出されていません。MCP サービス未設定、またはサービステスト/検出失敗の可能性があります。",
- "ai_chat.inspection.mcp.message.configured": "{{serverCount}} 件の MCP サービスが設定され、{{enabledCount}} 件が有効です",
- "ai_chat.inspection.mcp.message.empty": "MCP サービスはまだ設定されていません",
- "ai_chat.inspection.mcp.message.with_issues": "{{serverCount}} 件の MCP サービスが設定され、{{enabledCount}} 件が有効です。{{issueCount}} 件の設定チェック項目に対応が必要です",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "まず MCP サービス設定エラーを修正してから、サービスを再テストしてください",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "影響を受ける MCP サービスを開き、設定チェックのヒントに従って起動コマンド、引数、タイムアウトを分けてください",
- "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 件の MCP サービスに起動設定エラーがあり、テストとツール検出に失敗する可能性があります",
- "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 件の MCP サービスに起動設定警告があります。ツール検出失敗を診断する前に確認してください",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "例外またはキャンセル経路で空の assistant プレースホルダーメッセージが残っていないか確認してください",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "ストリーミング追記ロジックが同じ assistantMsgId を再利用し、同じ返信に新しい assistant メッセージを作っていないか確認してください",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "useAIChatLocalTools が各 tool_call_id に対して tool メッセージを書き込んでいるか優先的に確認してください",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "Returns whether the current chat input has all prerequisites to send, including active provider, missing key or endpoint on the current provider, selected model, current connection context, attached table context, and next actions. Use it when users ask why sending is disabled or what the chat input is missing.",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "No parameters",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "Read the send-prerequisite state of the current AI chat input, including active provider, key and endpoint completeness, selected model, current connection context, attached table schema count, and suggested next actions.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "AI コンテキスト量と安定性リスクを診断",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "現在または指定 AI セッションの最近メッセージ、ツール結果、添付テーブル DDL、MCP tool schemas、ユーザープロンプト、Skills の量を推定し、low/medium/high/critical リスク、主な膨張元、絞り込み提案を返します。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "任意。最大メッセージ、最大 DDL テーブル、最大 MCP schema の詳細を返すかどうか。既定は true。",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "任意。診断する AI session ID。省略時は現在のアクティブセッションを使います。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(既定 現在のセッション), messageLimit?(既定 40), includeDetails?(既定 true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "AI コンテキスト量と安定性リスクのスナップショットを読み取ります。最近のメッセージウィンドウ、ツール結果長、添付テーブル DDL、MCP tool schemas、ユーザープロンプト、有効 Skills を含みます。",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "Inspect current AI prompts and Skills configuration",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "Returns current user-defined global, database, and JVM prompts, plus enabled Skills, scopes, dependency tools, and skill prompt content. Use it when users ask which prompts are currently attached, why AI answers this way, or which Skills are active.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "No parameters",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "外部ツール接続状態: 未接続",
"ai_chat.mcp_client.install.state.remote": "外部ツール接続状態: リモート MCP ブリッジが必要です",
"ai_chat.mcp_client.install.state.stale": "外部ツール接続状態: 古い設定があり、更新が必要です",
- "ai_chat.mcp_client.install.status_tone.connected": "接続済み",
- "ai_chat.mcp_client.install.status_tone.not_connected": "未接続",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "リモートブリッジ",
- "ai_chat.mcp_client.install.status_tone.status_error": "状態エラー",
- "ai_chat.mcp_client.install.status_tone.update_required": "更新が必要",
- "ai_chat.mcp_client.install.status.cli_prefix": "CLI 検出: {{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "{{command}} を検出しました",
"ai_chat.mcp_client.install.status.cli.not_detected": "{{command}} は検出されませんでした。先に設定を書き込むことはできます",
"ai_chat.mcp_client.install.status.cli.remote": "リモート Agent ではローカルの {{command}} コマンド検出は不要です",
+ "ai_chat.mcp_client.install.status.cli_prefix": "CLI 検出: {{status}}",
"ai_chat.mcp_client.install.status.command_path": "コマンドパス: {{path}}",
"ai_chat.mcp_client.install.status.config_file": "設定ファイル: {{path}}",
"ai_chat.mcp_client.install.status.copy_command": "起動コマンドをコピー",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "状態を更新",
"ai_chat.mcp_client.install.status.remote_boundary": "リモート接続の境界: データベース接続情報とパスワードは Windows の GoNavi に残ります。クラウド Agent は既定で schema-only MCP ツールを使い、接続概要、オブジェクト一覧、テーブル、ビュー、DDL を読み取り、execute_sql は登録されません。マシンをまたいだ接続には、GoNavi Streamable HTTP モードを使い、token、トンネル、またはリバースプロキシを組み合わせてください。",
"ai_chat.mcp_client.install.status.title": "選択中クライアントの状態",
+ "ai_chat.mcp_client.install.status_tone.connected": "接続済み",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "未接続",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "リモートブリッジ",
+ "ai_chat.mcp_client.install.status_tone.status_error": "状態エラー",
+ "ai_chat.mcp_client.install.status_tone.update_required": "更新が必要",
"ai_chat.mcp_client.install.summary.connected": "{{label}} はこの GoNavi MCP に接続済みで、このクライアントから直接呼び出せます。",
"ai_chat.mcp_client.install.summary.error": "{{label}} の接続状態を読み取れませんでした。先に検出を更新してください。",
"ai_chat.mcp_client.install.summary.missing": "この GoNavi MCP はまだ {{label}} に接続されていません。",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "データベースオブジェクト一覧を取得",
"ai_chat.message.tool_call.get_table_ddl": "CREATE TABLE 文を抽出",
"ai_chat.message.tool_call.get_tables": "テーブル構造情報を分析",
- "ai_chat.message.tool_call.get_views": "ビュー構造情報を分析",
"ai_chat.message.tool_call.get_triggers": "トリガーロジックを確認",
+ "ai_chat.message.tool_call.get_views": "ビュー構造情報を分析",
"ai_chat.message.tool_call.inspect_active_tab": "現在のアクティブタブを読み込み",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "現在の AI チャット送信前状態を読み込み",
"ai_chat.message.tool_call.inspect_ai_context_budget": "AI コンテキスト量のリスクを診断",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "許可",
"ai_chat.system.context.permission.denied": "禁止",
"ai_chat.system.context.skill_prompt": "現在有効な Skill「{{skillName}}」({{skillDescription}})があります。この回答では、その制約と作業方法に従ってください:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "現在有効な Skill「{{skillName}}」があります。この回答では、その制約と作業方法に従ってください:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\n依存ツール: {{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "現在有効な Skill「{{skillName}}」があります。この回答では、その制約と作業方法に従ってください:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "ユーザーが送信できない理由、現在の AI chat に不足している設定、入力欄の準備状態を尋ねた場合は、先に inspect_ai_chat_readiness で実際の送信前状態を読む。",
"ai_chat.system.inspection_guidance.inspect_ai_context": "ユーザーが現在の AI コンテキスト、関連テーブル、会話に付与されたテーブル構造を尋ねた場合は、先に inspect_ai_context でマウント済みのテーブル構造コンテキストを読む。",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "ユーザーが AI の遅さ、過大なコンテキスト、多すぎるテーブル構造、長すぎるツール結果、不安定な回答、または複雑タスク前の文脈見積もりを求めた場合は、先に inspect_ai_context_budget でサイズリスクを読む。",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "有効な端点 URL を入力してください",
"ai_settings.form.api_format": "API 形式",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "空欄のままならこの端末でログイン済みの CodeBuddy CLI アカウントを使い、入力した場合はその認証情報を優先します。",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(任意)",
"ai_settings.form.api_key_keep_placeholder": "空欄のままなら保存済みシークレットを使い続けます",
"ai_settings.form.api_key_placeholder": "sk-... / あなたの API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "空欄ならローカルのログイン状態を使い、上書きする場合は API Key / Token を入力",
"ai_settings.form.api_key_required": "API Key を入力してください",
"ai_settings.form.api_key_saved_hint": "API Key は保存済みです。空欄のままなら継続利用し、新しい値を入力すると置き換えます。",
- "ai_settings.form.api_key.codebuddy_hint": "空欄のままならこの端末でログイン済みの CodeBuddy CLI アカウントを使い、入力した場合はその認証情報を優先します。",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(任意)",
"ai_settings.form.clear_saved_api_key": "保存済み API Key を削除",
+ "ai_settings.form.inline_completion_model": "自動補完モデル",
+ "ai_settings.form.inline_completion_model_hint": "SQL エディタのゴースト補完には、小さく高速なモデルを選べます。空欄の場合はチャットモデルに従います。",
+ "ai_settings.form.inline_completion_model_placeholder": "チャットモデルに従う",
"ai_settings.form.model_list": "利用可能モデル一覧(任意)",
"ai_settings.form.model_list_placeholder": "モデル ID を指定します。空欄の場合はサーバーから取得します",
"ai_settings.form.model_list_placeholder.codebuddy": "任意:よく使うモデルを事前入力できます。空欄なら CodeBuddy CLI またはサービス側で自動選択します",
"ai_settings.form.model_list_placeholder.cursor": "任意:よく使う Cursor モデル ID を事前入力できます。空欄なら Cursor の既定モデルを自動選択します",
- "ai_settings.form.inline_completion_model": "自動補完モデル",
- "ai_settings.form.inline_completion_model_hint": "SQL エディタのゴースト補完には、小さく高速なモデルを選べます。空欄の場合はチャットモデルに従います。",
- "ai_settings.form.inline_completion_model_placeholder": "チャットモデルに従う",
"ai_settings.form.provider_name": "プロバイダー名",
"ai_settings.form.provider_name_placeholder": "例:自前の OpenAI 互換端点 / 専用モデル",
"ai_settings.form.provider_name_required": "名前を入力してください",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "GoNavi MCP HTTP サービスは起動していません",
"ai_settings.mcp_server.argument_hints.action_separator": ";",
"ai_settings.mcp_server.argument_hints.argument_details": "引数ごとの説明",
- "ai_settings.mcp_server.argument_hints.business_arguments": "検出された業務引数",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "README がコマンド引数を要求する場合だけ認証情報を渡し、環境変数を優先してください。",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "アクセストークン",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "実値はローカルに入力し、チャットやスクリーンショットへ貼らないでください。",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "MCP サービスが必要とするサービスアドレスまたは API 入口を指定します。",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "ベース URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "完全なアドレスを入力し、URL に機密情報を含めないでください。",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "MCP サービスが使うローカルファイル、ディレクトリ、リポジトリ、または実行ファイルを示します。",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "設定ファイル",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "ローカルの絶対パスを使い、必要最小限の範囲だけ許可してください。",
"ai_settings.mcp_server.argument_hints.business.config.detail": "MCP サービスが使うローカルファイル、ディレクトリ、リポジトリ、または実行ファイルを示します。",
"ai_settings.mcp_server.argument_hints.business.config.label": "設定ファイル",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "ローカルの絶対パスを使い、必要最小限の範囲だけ許可してください。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "MCP サービスが使うローカルファイル、ディレクトリ、リポジトリ、または実行ファイルを示します。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "設定ファイル",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "ローカルの絶対パスを使い、必要最小限の範囲だけ許可してください。",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "MCP サービスが使うローカルファイル、ディレクトリ、リポジトリ、または実行ファイルを示します。",
"ai_settings.mcp_server.argument_hints.business.dir.label": "ディレクトリ",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "ローカルの絶対パスを使い、必要最小限の範囲だけ許可してください。",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "MCP サービスが使うローカルファイル、ディレクトリ、リポジトリ、または実行ファイルを示します。",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "ワークスペースディレクトリ",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "ローカルの絶対パスを使い、必要最小限の範囲だけ許可してください。",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "検出された業務引数",
"ai_settings.mcp_server.argument_hints.category.endpoint": "エンドポイント",
"ai_settings.mcp_server.argument_hints.category.generic": "業務",
"ai_settings.mcp_server.argument_hints.category.mode": "モード",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "{{envVarCount}} 個の変数を検出しました。そのうち {{secretLikeCount}} 個はシークレットのようです。ここでは key の用途とリスクだけを説明し、value は表示しません。",
"ai_settings.mcp_server.env_hints.title": "環境変数の用途ヒント",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "入力するもの:",
- "ai_settings.mcp_server.env_hints.warning_prefix": "注意: {{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "command=docker の場合、ここにある環境変数は docker CLI にのみ渡され、コンテナー内には自動的に入りません。",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} 個の環境変数値が空です。テスト前に入力するか削除してください。",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} 個の環境変数がまだサンプルのプレースホルダーのようです。",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "注意: {{warnings}}",
"ai_settings.mcp_server.form.action.delete": "削除",
"ai_settings.mcp_server.form.action.delete_cancel": "キャンセル",
"ai_settings.mcp_server.form.action.delete_confirm": "この MCP サービスを削除しますか?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "無効",
"ai_settings.mcp_server.form.enabled.option.enabled": "有効",
"ai_settings.mcp_server.form.enabled.title": "有効状態",
- "ai_settings.mcp_server.form.env_status.empty": "各行は KEY=VALUE 形式で入力してください。等号がない行や key に空白を含む行は保存されません。",
- "ai_settings.mcp_server.form.env_status.invalid": "{{validCount}} 個の環境変数を検出しました。さらに {{invalidCount}} 行は形式が無効なため今回は保存されません: {{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "{{count}} 個の環境変数を検出しました。",
"ai_settings.mcp_server.form.env.description": "1 行に 1 つ KEY=VALUE を入力します。通常は API Key、作業ディレクトリ、サービス URL などの設定に使います。不要な場合は空のままで構いません。これらはローカル設定に保存され、MCP プロセス起動時に環境変数として渡されます。export は書かず、秘密情報をチャット内容に入れないでください。",
"ai_settings.mcp_server.form.env.placeholder": "環境変数。1 行に 1 つ KEY=VALUE、例:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "環境変数",
+ "ai_settings.mcp_server.form.env_status.empty": "各行は KEY=VALUE 形式で入力してください。等号がない行や key に空白を含む行は保存されません。",
+ "ai_settings.mcp_server.form.env_status.invalid": "{{validCount}} 個の環境変数を検出しました。さらに {{invalidCount}} 行は形式が無効なため今回は保存されません: {{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "{{count}} 個の環境変数を検出しました。",
"ai_settings.mcp_server.form.instructions.save_description": "この MCP を長期利用のためローカル設定に書き込みます。",
"ai_settings.mcp_server.form.instructions.save_title": "保存",
"ai_settings.mcp_server.form.instructions.test_description": "現在のフィールドで一度だけ起動し、検出できるツールを確認します。設定は保存しません。",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "転送方式",
"ai_settings.mcp_server.guide.examples.description": "起動コマンドには実行ファイル本体だけを入れ、引数を混ぜないでください。よくある形式:",
"ai_settings.mcp_server.guide.examples.title": "入力例",
- "ai_settings.mcp_server.guide.field_lookup.description": "どのパラメーターに何を入れるか迷ったら、まずここを確認してください。下の各フィールドにも具体例と注意点があります。",
- "ai_settings.mcp_server.guide.field_lookup.title": "フィールド早見表",
"ai_settings.mcp_server.guide.field.args.avoid": "npx/node/uvx/python/docker を再度入力したり、複数の引数を 1 つの長い文字列として貼り付けたりしないでください。",
"ai_settings.mcp_server.guide.field.args.detail": "npx -y pkg --stdio は -y、pkg、--stdio に分けます。docker run --rm -i image は run、--rm、-i、image に分けます。",
"ai_settings.mcp_server.guide.field.args.fill": "-y、パッケージ名、スクリプト名、-m、--stdio、run、--rm、-i、イメージ名などを 1 つずつ入力します。",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "stdio のままにします。",
"ai_settings.mcp_server.guide.field.transport.summary": "GoNavi がこの MCP Server と通信する方式です。",
"ai_settings.mcp_server.guide.field.transport.title": "転送方式",
+ "ai_settings.mcp_server.guide.field_lookup.description": "どのパラメーターに何を入れるか迷ったら、まずここを確認してください。下の各フィールドにも具体例と注意点があります。",
+ "ai_settings.mcp_server.guide.field_lookup.title": "フィールド早見表",
"ai_settings.mcp_server.guide.full_command.apply": "下のフィールドへ自動分割",
"ai_settings.mcp_server.guide.full_command.description": "完全なコマンドをそのまま貼り付けると、GoNavi が「起動コマンド / コマンド引数 / 環境変数」の 3 つに自動分割します。Unix の KEY=VALUE、Windows PowerShell の $env:KEY=VALUE;、cmd の set KEY=VALUE && に対応します。",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "解析結果: コマンド {{command}}、引数 {{argsCount}} 個、環境変数 {{envCount}} 個。",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "例:",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "入力:",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "推奨接続方法:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "現在の境界:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "GoNavi 内蔵 MCP のローカル入口は stdio であり、GoNavi と同じマシンで動く Claude Code / Codex などのクライアントに適しています。",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "OpenClaw/Hermans がクラウド Linux で動く場合、Windows ローカルの stdio コマンドは直接使えません。Windows で GoNavi Streamable HTTP モードを起動し、トンネルまたはリバースプロキシ経由でクラウド Agent から呼び出します。",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "現在の境界:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "GUI なし / CLI 設定生成コマンド:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "コピー可能な設定スニペット(mcpServers JSON 対応 Agent 向け):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "現在のヒント: {{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "または環境変数 GONAVI_MCP_HTTP_TOKEN= を設定してから {{standaloneCommand}} を実行します",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "リモートで SQL 実行が明確に必要な場合は --schema-only を外せます。その場合も execute_sql は GoNavi AI の安全制御下にあり、書き込みには allowMutating=true を明示する必要があります。",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目的:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "データベース接続、アカウント、パスワードは Windows 上の GoNavi に残します。クラウド Agent がデータベースパスワードを保存する必要はありません。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "リモートアクセスは既定で schema-only モードを使用し、execute_sql を登録しません。OpenClaw/Hermans にスキーマ構造だけを渡す用途に適しています。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "クラウド Agent は MCP tools を通じて get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl などの結果だけを読み取ります。",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目的:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "CLI / サービス起動コマンド:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. {{displayName}} にリモート MCP Server を追加し、transport は Streamable HTTP、URL はトンネル/リバースプロキシ後の /mcp アドレス、Authorization は Bearer に設定します。",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. まず get_connections で connectionId を取得し、その後スキーマツールを呼び出します。データベース host/user/password をクラウド Agent 設定に書かないでください。",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "データベース会話向け追加プロンプト",
"ai_settings.prompts.field.global.description": "すべての AI セッションに適用されます。例: 「先に結論を書く」「回答を簡潔に保つ」。",
"ai_settings.prompts.field.global.title": "全体向け追加プロンプト",
- "ai_settings.prompts.field.jvm_diagnostic.description": "JVM 診断ワークスペースだけに適用されます。例: 「コマンドの前に計画を示す」。",
- "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 診断向け追加プロンプト",
"ai_settings.prompts.field.jvm.description": "JVM リソース閲覧/分析シナリオだけに適用されます。",
"ai_settings.prompts.field.jvm.title": "JVM リソース分析向け追加プロンプト",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "JVM 診断ワークスペースだけに適用されます。例: 「コマンドの前に計画を示す」。",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 診断向け追加プロンプト",
"ai_settings.prompts.message.save_failed": "カスタムプロンプトの保存に失敗しました",
"ai_settings.prompts.message.saved": "カスタムプロンプトを保存しました",
"ai_settings.prompts.placeholder.empty": "空欄の場合は追加しません",
"ai_settings.prompts.user.description": "この内容は組み込みシステムプロンプトの後に system message として追加されます。個人の文体、出力制約、チーム規約を入れる用途に向いています。安全境界ではシステム規則が引き続き優先されます。",
"ai_settings.prompts.user.title": "ユーザー単位のカスタムプロンプト",
+ "ai_settings.provider.action.add": "モデルプロバイダーを追加",
+ "ai_settings.provider.action.delete": "削除",
+ "ai_settings.provider.action.edit": "編集",
+ "ai_settings.provider.auto_model": "自動選択",
+ "ai_settings.provider.confirm_delete": "このプロバイダーを削除しますか?",
+ "ai_settings.provider.editor.add_title": "モデルプロバイダーを追加",
+ "ai_settings.provider.editor.edit_title": "モデルプロバイダーを編集",
+ "ai_settings.provider.empty.description": "追加すると AI アシスタントを使い始められます",
+ "ai_settings.provider.empty.title": "モデルプロバイダーが未設定です",
+ "ai_settings.provider.next_provider": "次のプロバイダー",
+ "ai_settings.provider.no_model": "モデル未選択",
"ai_settings.provider_preset.anthropic.desc": "Claude Opus/Sonnet モデル",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "カスタム API 端点",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "Volcengine Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "GLM-5 / GLM-5-Turbo モデル",
"ai_settings.provider_preset.zhipu.label": "Zhipu GLM",
- "ai_settings.provider.action.add": "モデルプロバイダーを追加",
- "ai_settings.provider.action.delete": "削除",
- "ai_settings.provider.action.edit": "編集",
- "ai_settings.provider.auto_model": "自動選択",
- "ai_settings.provider.confirm_delete": "このプロバイダーを削除しますか?",
- "ai_settings.provider.editor.add_title": "モデルプロバイダーを追加",
- "ai_settings.provider.editor.edit_title": "モデルプロバイダーを編集",
- "ai_settings.provider.empty.description": "追加すると AI アシスタントを使い始められます",
- "ai_settings.provider.empty.title": "モデルプロバイダーが未設定です",
- "ai_settings.provider.next_provider": "次のプロバイダー",
- "ai_settings.provider.no_model": "モデル未選択",
"ai_settings.safety.description": "AI が実行できる SQL 操作種別を制御し、データを保護します",
"ai_settings.safety.full.desc": "AI は DDL を含むすべての操作を実行できます。高リスク操作では自動的に警告します。",
"ai_settings.safety.full.label": "完全モード",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "データベース",
"ai_settings.skill.scope.global.desc": "すべての AI 会話で有効",
"ai_settings.skill.scope.global.label": "グローバル",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "JVM 診断ワークベンチでのみ有効",
- "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 診断",
"ai_settings.skill.scope.jvm.desc": "JVM リソース分析シナリオでのみ有効",
"ai_settings.skill.scope.jvm.label": "JVM リソース",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "JVM 診断ワークベンチでのみ有効",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 診断",
"ai_settings.skill.scopes_placeholder": "この Skill を適用する場面を選択",
"ai_settings.skill.status.disabled": "無効",
"ai_settings.skill.status.enabled": "有効",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "任意",
"ai_settings.tools.parameters.required": "必須",
"ai_settings.tools.parameters.type_label": "型:{{type}}",
- "ai_settings.tools.params_label": "パラメーター:",
"ai_settings.tools.params.none": "パラメーターなし",
+ "ai_settings.tools.params_label": "パラメーター:",
"ai_settings.tools.search.aria_label": "組み込みツールを検索",
"ai_settings.tools.search.clear": "クリア",
"ai_settings.tools.search.placeholder": "ツール、フロー、パラメーターを検索。例:mcp / lineLimit / allowMutating / transaction",
"ai_settings.tools.summary": "{{flowVisible}}/{{flowTotal}} 件の推奨フロー、{{toolVisible}}/{{toolTotal}} 個の組み込みツールを表示中。",
"ai_settings.tools.workflow": "💡 ワークフロー:get_connections → get_databases → get_tables → get_columns → SQL 生成",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "Claude Code 設定ディレクトリの作成に失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 設定の形式が正しくありません: {{path}} は {{expected}} である必要があります",
- "ai.service.mcp_client.claude_code.config_parse_failed": "Claude Code 設定の解析に失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "Claude Code 設定の場所を特定できませんでした: {{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "Claude Code 設定の読み取りに失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "Claude Code 設定のシリアライズに失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "Claude Code 設定の書き込みに失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "Claude Code のユーザーレベル MCP 設定を書き込みました。Claude CLI を再起動すると、/mcp の User MCPs に GoNavi が表示されます。",
- "ai.service.mcp_client.claude_code.status.connected": "Claude Code のユーザーレベル GoNavi MCP 設定が検出され、現在の GoNavi インストールパスと一致しています",
- "ai.service.mcp_client.claude_code.status.missing": "Claude Code のユーザーレベル GoNavi MCP 設定は検出されませんでした",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "Claude Code 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスの確認に失敗しました: {{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "Claude Code 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスと一致しません。更新を推奨します。",
- "ai.service.mcp_client.codex.config_dir_create_failed": "Codex 設定ディレクトリの作成に失敗しました: {{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Codex 設定の形式が正しくありません: {{path}} を {{expected}} として解析できませんでした",
- "ai.service.mcp_client.codex.config_path_failed": "Codex 設定の場所を特定できませんでした: {{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "Codex 設定の読み取りに失敗しました: {{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "Codex 設定の書き込みに失敗しました: {{detail}}",
- "ai.service.mcp_client.codex.install_success": "Codex のユーザーレベル MCP 設定を書き込みました。Codex CLI またはデスクトップアプリを再起動すると GoNavi が表示されます。",
- "ai.service.mcp_client.codex.status.connected": "Codex のユーザーレベル GoNavi MCP 設定が検出され、現在の GoNavi インストールパスと一致しています",
- "ai.service.mcp_client.codex.status.missing": "Codex のユーザーレベル GoNavi MCP 設定は検出されませんでした",
- "ai.service.mcp_client.codex.status.path_check_failed": "Codex 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスの確認に失敗しました: {{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "Codex 内に GoNavi MCP レコードが検出されましたが、現在の GoNavi インストールパスと一致しません。更新を推奨します。",
- "ai.service.mcp_client.executable_path_empty": "現在の GoNavi 実行ファイルパスが空です",
- "ai.service.mcp_client.executable_path_failed": "現在の GoNavi 実行ファイルの場所を特定できませんでした: {{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} は通常クラウドまたはリモート環境で動作します。リモート MCP ブリッジ経由で Windows GoNavi に接続してください。データベースパスワードはこの GoNavi マシンに残ります。",
- "ai.service.mcp_client.user_home_dir_unavailable": "現在のユーザーのホームディレクトリを特定できませんでした",
"app.about.action.check_updates": "更新を確認",
"app.about.action.download_progress": "ダウンロード状況",
"app.about.action.download_update": "更新をダウンロード",
@@ -2433,8 +2433,8 @@
"app.about.hero.update_available_version": "新しいバージョン {{version}} が見つかりました",
"app.about.last_checked_at": "前回確認日時: {{time}}",
"app.about.last_checked_never": "まだ更新を確認していません",
- "app.about.message.check_failed_with_error": "更新確認に失敗しました: {{error}}",
"app.about.message.channel_switch_failed_with_error": "更新チャネルの切り替えに失敗しました: {{error}}",
+ "app.about.message.check_failed_with_error": "更新確認に失敗しました: {{error}}",
"app.about.message.download_completed": "更新のダウンロードが完了しました",
"app.about.message.download_completed_with_path": "更新のダウンロードが完了しました。パッケージパス: {{path}}",
"app.about.message.download_failed_with_error": "更新のダウンロードに失敗しました: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "ブラウザ mock は実際の MCP サービスに接続されていません",
"app.browser_mock.provider.test_failed_detail": "接続テストに失敗しました: {{detail}}",
"app.browser_mock.provider.test_success": "エンドポイント接続テストに成功しました",
+ "app.connection.message.editable_load_failed": "保存済み接続の詳細を読み込めませんでした。代わりにマスク済み設定を開きます。",
+ "app.connection.message.editable_load_failed_with_detail": "保存済み接続の詳細を読み込めませんでした: {{detail}}。代わりにマスク済み設定を開きます。",
"app.connection_package.action.start_export": "エクスポート開始",
"app.connection_package.action.start_import": "インポート開始",
"app.connection_package.dialog.export_title": "接続をエクスポート",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "{{count}} 件の接続をインポートしました。一部の接続にはパスワードが含まれていません。該当する接続を編集し、パスワードを入力して保存してください。",
"app.connection_package.message.no_connections_to_export": "エクスポートできる接続がありません",
"app.connection_package.message.unsupported_file_format": "ファイル形式エラー: GoNavi 復元パッケージ、履歴 JSON 接続配列、MySQL Workbench XML、または Navicat NCX のみ対応しています",
- "app.connection.message.editable_load_failed": "保存済み接続の詳細を読み込めませんでした。代わりにマスク済み設定を開きます。",
- "app.connection.message.editable_load_failed_with_detail": "保存済み接続の詳細を読み込めませんでした: {{detail}}。代わりにマスク済み設定を開きます。",
"app.data_root.action.migrate_and_switch": "既存データを移行して切り替え",
"app.data_root.action.open_current": "現在のディレクトリを開く",
"app.data_root.action.restore_default_directory": "既定のディレクトリに戻す",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "AI 設定",
"app.settings.entry.proxy.description": "更新確認、ドライバー管理、共通ネットワーク出口を設定します。",
"app.settings.entry.proxy.title": "グローバルプロキシ",
- "app.settings.entry.web_auth.description": "ブラウザアクセス認証の状態を確認し、管理者パスワードを変更します。",
- "app.settings.entry.web_auth.title": "ブラウザアクセス認証",
"app.settings.entry.theme.description": "ライト/ダークテーマを切り替え、表示の見た目を調整します。",
"app.settings.entry.theme.title": "テーマと外観",
+ "app.settings.entry.web_auth.description": "ブラウザアクセス認証の状態を確認し、管理者パスワードを変更します。",
+ "app.settings.entry.web_auth.title": "ブラウザアクセス認証",
"app.settings.group.about.description": "バージョン情報、リポジトリリンク、そのほか製品情報を確認します。",
"app.settings.group.about.title": "情報",
"app.settings.group.preferences.description": "言語、外観、サイドバー表示の設定をまとめます。",
"app.settings.group.preferences.title": "基本設定",
"app.settings.group.services.description": "ネットワークアクセスと AI サービス関連の設定です。",
"app.settings.group.services.title": "サービス",
+ "app.settings.sidebar_metadata.description": "左サイドバーのテーブル名の横に表示するメタデータを選択します。",
+ "app.settings.sidebar_metadata.title": "サイドバーテーブルメタデータ",
+ "app.settings.title": "設定センター",
"app.settings.web_auth.description": "現在のブラウザアクセス認証状態、セッションポリシー、2FA の有効状態を確認できます。サインイン後に管理者パスワードも変更できます。",
"app.settings.web_auth.load_failed": "ブラウザアクセス認証設定の読み込みに失敗しました",
"app.settings.web_auth.password.code_label": "現在の認証コード / リカバリーコード",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} 時間",
"app.settings.web_auth.value.minutes": "{{count}} 分",
"app.settings.web_auth.value.recovery_codes": "残り {{count}} 個",
- "app.settings.sidebar_metadata.description": "左サイドバーのテーブル名の横に表示するメタデータを選択します。",
- "app.settings.sidebar_metadata.title": "サイドバーテーブルメタデータ",
- "app.settings.title": "設定センター",
"app.shortcuts.action.diagnoseQuery.description": "現在の SQL に対して EXPLAIN を実行し、実行計画図とインデックス提案を表示します",
"app.shortcuts.action.diagnoseQuery.label": "SQL 診断",
+ "app.shortcuts.action.duplicateCurrentLine.description": "クエリエディターでカーソル位置の行を複製して次の行へ挿入します",
+ "app.shortcuts.action.duplicateCurrentLine.label": "現在の行を下に複製",
"app.shortcuts.action.focusSidebarSearch.description": "左側の接続ツリー検索ボックスにフォーカスします",
"app.shortcuts.action.focusSidebarSearch.label": "サイドバー検索にフォーカス",
+ "app.shortcuts.action.formatSql.description": "現在のクエリエディターの SQL を整形します",
+ "app.shortcuts.action.formatSql.label": "SQL を整形",
"app.shortcuts.action.newConnection.description": "新しいデータベース、ランタイム、またはその他のデータソース接続を作成します",
"app.shortcuts.action.newConnection.label": "新規データソース",
"app.shortcuts.action.newQueryTab.description": "新しい SQL クエリタブを作成します",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "SQL を実行",
"app.shortcuts.action.saveQuery.description": "現在のクエリタブを保存します。名前のないクエリでは保存ダイアログを開きます",
"app.shortcuts.action.saveQuery.label": "クエリを保存",
- "app.shortcuts.action.duplicateCurrentLine.description": "クエリエディターでカーソル位置の行を複製して次の行へ挿入します",
- "app.shortcuts.action.duplicateCurrentLine.label": "現在の行を下に複製",
- "app.shortcuts.action.formatSql.description": "現在のクエリエディターの SQL を整形します",
- "app.shortcuts.action.formatSql.label": "SQL を整形",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "現在の SQL エディターで AI インライン補完を手動で要求します",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "SQL AI 補完を実行",
"app.shortcuts.action.selectCurrentStatement.description": "クエリエディターでカーソル位置の行を選択してクリップボードにコピーします",
"app.shortcuts.action.selectCurrentStatement.label": "現在の行を選択してコピー",
"app.shortcuts.action.sendAIChatMessage.description": "AI 入力欄の現在のメッセージを送信します。Shift+Enter は常に改行します",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "結果エリアを切り替え",
"app.shortcuts.action.toggleTheme.description": "ライトテーマとダークテーマを切り替えます",
"app.shortcuts.action.toggleTheme.label": "テーマを切り替え",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "現在の SQL エディターで AI インライン補完を手動で要求します",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "SQL AI 補完を実行",
"app.shortcuts.capture_hint": "「記録」をクリックした後にショートカットを押してください。Esc で記録をキャンセルできます。グローバルショートカットには修飾キーを含めることを推奨します。AI チャット送信は Enter 関連の組み合わせのみ対応し、Shift+Enter は改行のままです。",
"app.shortcuts.capture_waiting": "ショートカットを押してください...",
"app.shortcuts.context.datagrid": "データグリッド",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "ローカル設定を読み込んでいます...",
"app.startup_readiness.loading_security_config": "セキュリティ設定を読み込んでいます...",
"app.theme.action.restore_defaults": "既定に戻す",
- "app.theme.appearance_settings_description": "スケール、フォントサイズ、透明度、ぼかし効果をまとめて調整します。",
- "app.theme.appearance_settings_title": "外観設定",
"app.theme.appearance.blur_hint": "* アプリ内オーバーレイ層のぼかしのみを制御します",
"app.theme.appearance.blur_title": "ガウスぼかし (Blur)",
"app.theme.appearance.enable_transparency_blur": "透明度とぼかしを有効化",
"app.theme.appearance.enable_transparency_blur_hint": "無効にすると現在のしきい値は保持され、再度有効化したときにそのまま復元されます。",
"app.theme.appearance.font_size_title": "基本フォントサイズ (Font Size)",
"app.theme.appearance.opacity_title": "背景の不透明度 (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "V2 左側ナビゲーションレールにのみ適用されます。大画面でボタンや接続アイコンを見やすく拡大できます。",
+ "app.theme.appearance.sidebar_rail_scale_title": "左側ナビゲーションボタンのサイズ",
"app.theme.appearance.transparency_blur_title": "透明度とぼかし効果",
"app.theme.appearance.ui_scale_hint": "* 小さい画面では 85%-95% を推奨します",
"app.theme.appearance.ui_scale_title": "UI スケール (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "V2 左側ナビゲーションレールにのみ適用されます。大画面でボタンや接続アイコンを見やすく拡大できます。",
- "app.theme.appearance.sidebar_rail_scale_title": "左側ナビゲーションボタンのサイズ",
"app.theme.appearance.windows_acrylic_hint": "Windows ではシステムの Acrylic 効果を使用します。ぼかしの強さはシステムにより制御されます。",
+ "app.theme.appearance_settings_description": "スケール、フォントサイズ、透明度、ぼかし効果をまとめて調整します。",
+ "app.theme.appearance_settings_title": "外観設定",
"app.theme.data_table.column_width_hint": "標準モードの既定列幅は 200px、コンパクトモードの既定列幅は 140px です。手動で調整した列幅は優先して保持されます。",
"app.theme.data_table.column_width_mode": "データテーブル列幅モード",
"app.theme.data_table.column_width_mode.compact": "コンパクト 140px",
"app.theme.data_table.column_width_mode.standard": "標準 200px",
"app.theme.data_table.density": "テーブル密度",
- "app.theme.data_table.density_hint": "行の高さ、列幅、余白を制御します。ゆったりは大画面での確認に適し、コンパクトは情報密度を最大化します。手動でドラッグした列幅は優先して保持されます。",
"app.theme.data_table.density.comfortable": "ゆったり",
"app.theme.data_table.density.compact": "コンパクト",
"app.theme.data_table.density.standard": "標準",
+ "app.theme.data_table.density_hint": "行の高さ、列幅、余白を制御します。ゆったりは大画面での確認に適し、コンパクトは情報密度を最大化します。手動でドラッグした列幅は優先して保持されます。",
"app.theme.data_table.follow_global": "全体設定に従う",
"app.theme.data_table.font_size": "データテーブルのフォントサイズ",
"app.theme.data_table.sidebar_tree_font_size": "左側スキーマツリーのフォントサイズ",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "等幅フォントファミリー",
"app.theme.font_family.title": "フォントファミリー",
"app.theme.font_family.ui_title": "UI フォントファミリー",
- "app.theme.query_template.description": "新しいクエリタブを開いたときに自動入力する SQL を設定します。",
- "app.theme.query_template.hint": "空にすると新しいクエリタブは空白のまま開きます。既定に戻すと SELECT * FROM に戻ります。",
- "app.theme.query_template.reset_default": "既定に戻す",
- "app.theme.query_template.title": "新規クエリの既定 SQL",
"app.theme.mac_window.restart_hint": "* 右上のカスタムボタンは非表示に同期されています。システムウィンドウのスタイルがすぐに更新されない場合は、アプリを再起動して確認してください",
"app.theme.mac_window.title": "macOS ウィンドウ制御",
"app.theme.mac_window.use_native_controls": "macOS ネイティブウィンドウ制御を使用",
"app.theme.mac_window.use_native_controls_hint": "有効にすると左上に赤/黄/緑のボタンを表示し、macOS ネイティブのフルスクリーン動作を優先します。",
- "app.theme.mode_title": "テーマモード",
"app.theme.mode.dark.description": "暗い環境に適し、落ち着いた見た目になります。",
"app.theme.mode.dark.label": "ダークテーマ",
"app.theme.mode.light.description": "明るい環境に適し、軽やかな階層感になります。",
"app.theme.mode.light.label": "ライトテーマ",
"app.theme.mode.system.description": "OS の外観設定に追従して自動で切り替えます。",
"app.theme.mode.system.label": "システムに追従",
+ "app.theme.mode_title": "テーマモード",
"app.theme.nav.appearance.description": "スケール、フォント、透明度",
"app.theme.nav.appearance.title": "外観パラメータ",
"app.theme.nav.theme.description": "ライト/ダーク切り替え",
"app.theme.nav.theme.title": "テーマモード",
"app.theme.navigation_title": "設定ナビゲーション",
+ "app.theme.query_template.description": "新しいクエリタブを開いたときに自動入力する SQL を設定します。",
+ "app.theme.query_template.hint": "空にすると新しいクエリタブは空白のまま開きます。既定に戻すと SELECT * FROM に戻ります。",
+ "app.theme.query_template.reset_default": "既定に戻す",
+ "app.theme.query_template.title": "新規クエリの既定 SQL",
"app.theme.startup_window.fullscreen": "起動時にフルスクリーン",
"app.theme.startup_window.fullscreen_windows": "起動時にフルスクリーン (Windows では最大化として扱います)",
"app.theme.startup_window.hint": "* 変更は次回起動時に有効になります",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "バックグラウンドに隠す",
"app.update.action.install_update": "更新をインストール",
"app.update.action.open_install_directory": "インストールディレクトリを開く",
+ "app.update.backend.error.channel_invalid": "無効な更新チャネルです: {{channel}}",
"app.update.backend.error.check_failed": "更新確認に失敗しました: {{detail}}",
"app.update.backend.error.check_http_status": "更新確認に失敗しました: HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "無効な更新チャネルです: {{channel}}",
"app.update.backend.error.download_failed": "更新のダウンロードに失敗しました: {{detail}}",
+ "app.update.backend.error.install_target_not_writable": "現在のインストール先ディレクトリに書き込めません: {{path}} ({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "現在のインストール先ディレクトリを特定できません",
"app.update.backend.error.install_unsupported": "このプラットフォームでは更新のインストールに対応していません: {{platform}}",
"app.update.backend.error.latest_version_unparseable": "最新バージョン番号を解析できません",
"app.update.backend.error.network_dns": "GitHub に接続できません: {{host}} を解決できません。グローバルプロキシを適用済みか確認するか、先にグローバルプロキシ設定で接続をテストしてください。",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS に現在のプラットフォーム用更新パッケージが含まれていません",
"app.update.backend.error.sha256sums_download_failed": "SHA256SUMS のダウンロードに失敗しました: HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release に SHA256SUMS が提供されていません",
- "app.update.backend.error.install_target_not_writable": "現在のインストール先ディレクトリに書き込めません: {{path}} ({{detail}})",
- "app.update.backend.error.install_target_unresolved": "現在のインストール先ディレクトリを特定できません",
"app.update.backend.error.update_package_not_found": "更新パッケージが見つかりません: {{name}}",
"app.update.backend.message.app_directory_unavailable": "アプリディレクトリにアクセスできません: {{path}}",
"app.update.backend.message.app_directory_unresolved_download": "現在のアプリディレクトリを特定できないため、更新をダウンロードできません",
@@ -3015,6 +3015,64 @@
"common.success": "成功",
"common.unknown": "不明",
"common.warning": "警告",
+ "connection.backend.action.apply_result_changes": "結果セットの変更を適用",
+ "connection.backend.action.clear_table": "テーブルデータを削除",
+ "connection.backend.action.create_database": "データベースを作成",
+ "connection.backend.action.create_schema": "スキーマを作成",
+ "connection.backend.action.data_sync_structure": "同期先の構造変更",
+ "connection.backend.action.data_sync_write": "同期データを書き込む",
+ "connection.backend.action.drop_database": "データベースを削除",
+ "connection.backend.action.drop_function_or_procedure": "関数またはストアドプロシージャを削除",
+ "connection.backend.action.drop_schema": "スキーマを削除",
+ "connection.backend.action.drop_table": "テーブルを削除",
+ "connection.backend.action.drop_view": "ビューを削除",
+ "connection.backend.action.import_data": "データをインポート",
+ "connection.backend.action.preview_result_changes": "結果セットの変更をプレビュー",
+ "connection.backend.action.rename_database": "データベース名を変更",
+ "connection.backend.action.rename_schema": "スキーマ名を変更",
+ "connection.backend.action.rename_table": "テーブル名を変更",
+ "connection.backend.action.rename_view": "ビュー名を変更",
+ "connection.backend.action.truncate_table": "テーブルを TRUNCATE",
+ "connection.backend.error.readonly_action_blocked": "この接続では本番保護が有効なため、{{action}}は実行できません。",
+ "connection.copy_suffix": " - コピー",
+ "connection.delete": "接続を削除",
+ "connection.edit": "接続を編集",
+ "connection.new": "新規接続",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase は MySQL/Oracle テナントプロトコルのみ対応しています。「{{value}}」はサポートされていません。MySQL または Oracle に切り替えてください。",
+ "connection.sidebar.delete.backendUnavailable": "接続の削除に失敗しました:バックエンド API を利用できません",
+ "connection.sidebar.delete.confirmContent": "接続「{{name}}」を削除しますか?",
+ "connection.sidebar.delete.confirmTitle": "削除の確認",
+ "connection.sidebar.delete.failureFallback": "接続の削除に失敗しました",
+ "connection.sidebar.delete.success": "接続を削除しました",
+ "connection.sidebar.disconnect.success": "接続を切断しました",
+ "connection.sidebar.duplicate.backendUnavailable": "接続の複製に失敗しました:バックエンド API を利用できません",
+ "connection.sidebar.duplicate.failureFallback": "接続の複製に失敗しました",
+ "connection.sidebar.duplicate.noResult": "接続の複製に失敗しました:バックエンドから結果が返されませんでした",
+ "connection.sidebar.duplicate.success": "接続を複製しました: {{name}}",
+ "connection.sidebar.group.badge": "グループ",
+ "connection.sidebar.group.collapseAria": "接続グループ {{name}} を折りたたむ",
+ "connection.sidebar.group.delete": "グループを削除",
+ "connection.sidebar.group.deleteConfirmContent": "グループ「{{name}}」を削除しますか?中の接続は削除されません。",
+ "connection.sidebar.group.deleteConfirmTitle": "削除の確認",
+ "connection.sidebar.group.edit": "グループを編集",
+ "connection.sidebar.group.expandAria": "接続グループ {{name}} を展開",
+ "connection.sidebar.group.meta": "{{count}} 件の接続 · 接続グループ",
+ "connection.sidebar.group.untitled": "無題のグループ",
+ "connection.sidebar.menu.copy": "接続を複製",
+ "connection.sidebar.menu.createDatabase": "新規データベース",
+ "connection.sidebar.menu.current": "現在",
+ "connection.sidebar.menu.delete": "接続を削除",
+ "connection.sidebar.menu.disconnect": "接続を切断",
+ "connection.sidebar.menu.groupSection": "接続グループ",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "アドレス未設定",
+ "connection.sidebar.menu.moveOutTag": "タグから外す",
+ "connection.sidebar.menu.moveToTag": "タグへ移動",
+ "connection.sidebar.menu.moveToUngrouped": "グループから外す",
+ "connection.sidebar.menu.refresh": "接続を更新",
+ "connection.sidebar.menu.section": "接続",
+ "connection.test": "接続をテスト",
+ "connection.unnamed": "名前なしの接続",
"connection_modal.action.browse": "参照...",
"connection_modal.action.cancel": "キャンセル",
"connection_modal.action.close": "閉じる",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "接続 URI を入力、生成、または解析します。",
"connection_modal.config_section.uri.title": "接続 URI",
"connection_modal.db_icon_label.custom": "カスタム",
+ "connection_modal.db_type.custom": "カスタム",
"connection_modal.db_type_hint.custom": "カスタムドライバーと DSN でデータベースに接続します。",
"connection_modal.db_type_hint.file": "ローカルの SQLite または DuckDB データベースファイルを選択します。",
"connection_modal.db_type_hint.mongodb": "MongoDB 単体、Replica Set、または SRV アドレスに接続します。",
"connection_modal.db_type_hint.redis": "Redis 単体または Redis Cluster に接続します。",
"connection_modal.db_type_hint.standard": "ホスト、ポート、認証情報、任意のデータベースを入力します。",
- "connection_modal.db_type.custom": "カスタム",
"connection_modal.driver.current": "現在",
"connection_modal.error.unknown": "不明なエラー",
"connection_modal.error.unknown_exception": "不明なエラー",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "接続名",
"connection_modal.field.connection_timeout_seconds": "接続タイムアウト(秒)",
"connection_modal.field.connection_timeout_seconds_ascii": "接続タイムアウト(秒)",
- "connection_modal.field.default_database_optional": "既定の接続データベース(任意)",
"connection_modal.field.defaultDatabase.placeholder": "例: appdb",
+ "connection_modal.field.default_database_optional": "既定の接続データベース(任意)",
"connection_modal.field.display_databases_optional": "表示するデータベース(任意)",
- "connection_modal.field.driver_name": "ドライバー名前",
"connection_modal.field.driver.placeholder": "例: mysql, postgres",
+ "connection_modal.field.driver_name": "ドライバー名前",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "例: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "ファイルパス(絶対パス)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Replica Set ユーザー名(任意)",
"connection_modal.field.replica_username_optional": "レプリカユーザー名(任意)",
"connection_modal.field.save_password": "パスワードを保存",
- "connection_modal.field.service_name": "サービス名",
"connection_modal.field.serviceName.placeholder": "例: ORCLPDB1",
+ "connection_modal.field.service_name": "サービス名",
"connection_modal.field.ssh_host": "SSH ホスト",
"connection_modal.field.ssh_password": "SSH パスワード",
"connection_modal.field.ssh_user": "SSH ユーザー",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "直接ネットワーク接続が制限される場合に GoNavi Agent 経由で接続します。",
"connection_modal.jvm.agent_help": "GoNavi Agent サービスのベース URL。",
"connection_modal.jvm.agent_url": "Agent URL",
- "connection_modal.jvm.diagnostic_api_key_optional": "診断 API キー(任意)",
- "connection_modal.jvm.diagnostic_description": "JVM トラブルシューティング用の任意診断コマンドを有効にします。",
- "connection_modal.jvm.diagnostic_disabled_hint": "診断拡張は無効です。実行時調査が必要な場合のみ有効にしてください。",
- "connection_modal.jvm.diagnostic_timeout_seconds": "診断タイムアウト(秒)",
- "connection_modal.jvm.diagnostic_title": "診断拡張",
- "connection_modal.jvm.diagnostic_transport": "診断トランスポート",
"connection_modal.jvm.diagnostic.agent_bridge_description": "GoNavi Agent Bridge の診断 Endpoint を使用します。",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "Arthas Tunnel で対象 JVM に到達します。",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Arthas Tunnel サーバーのベース URL。",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "実行時負荷を増やす trace や watch などのコマンドを許可します。",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "診断 API キー(任意)",
+ "connection_modal.jvm.diagnostic_description": "JVM トラブルシューティング用の任意診断コマンドを有効にします。",
+ "connection_modal.jvm.diagnostic_disabled_hint": "診断拡張は無効です。実行時調査が必要な場合のみ有効にしてください。",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "診断タイムアウト(秒)",
+ "connection_modal.jvm.diagnostic_title": "診断拡張",
+ "connection_modal.jvm.diagnostic_transport": "診断トランスポート",
"connection_modal.jvm.endpoint_api_key_optional": "Endpoint API キー(任意)",
"connection_modal.jvm.endpoint_description": "直接 JMX ではなくサービスが公開する Endpoint に接続します。",
"connection_modal.jvm.endpoint_help": "JVM 管理 Endpoint のベース URL。",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "ローカルまたは単純な環境向けに、NameServer を 1 つだけ設定します。",
"connection_modal.messageQueue.rocketmq.topology.single.label": "単一 NameServer",
"connection_modal.messageQueue.topology.cluster.label": "クラスターモード",
- "connection_modal.mongodb.auth_mechanism": "認証メカニズム",
"connection_modal.mongodb.auth.auto": "自動",
"connection_modal.mongodb.auth.auto_description": "ドライバーに認証メカニズムを選択させます。",
"connection_modal.mongodb.auth.aws_iam_description": "AWS IAM 認証を使用します。AWS IAM 認証情報は実行環境に配置してください。",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "MongoDB 認証なしで接続します。",
"connection_modal.mongodb.auth.scram_sha1_description": "SCRAM-SHA-1 認証を使用します。",
"connection_modal.mongodb.auth.scram_sha256_description": "SCRAM-SHA-256 認証を使用します。",
+ "connection_modal.mongodb.auth_mechanism": "認証メカニズム",
"connection_modal.mongodb.discovery.current": "現在",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV と SSH Tunnel を同時に有効にすると、ローカル DNS 解決に依存する場合があります。",
"connection_modal.mongodb.discovery.srv.description": "mongodb+srv を使用し、DNS で対象ノードを検出します。",
"connection_modal.mongodb.discovery.srv.label": "SRV アドレス",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV と SSH Tunnel を同時に有効にすると、ローカル DNS 解決に依存する場合があります。",
"connection_modal.mongodb.discovery.standard.description": "host:port で直接接続するか、レプリカセットのノード一覧を使用します。",
"connection_modal.mongodb.discovery.standard.label": "標準アドレス",
"connection_modal.mongodb.members.health": "ヘルス",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "オン",
"connection_modal.table.health": "ヘルス",
"connection_modal.table.role": "ロール",
+ "connection_modal.test.redis_database_list_failure": "接続には成功しましたが、Redis データベース一覧の取得に失敗しました:{{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "接続には成功しましたが、Redis データベース一覧の取得がタイムアウトしました(>{{seconds}} 秒)",
"connection_modal.test_error.description": "バックエンドから返された完全なエラーを確認します。",
"connection_modal.test_error.empty": "エラー詳細はありません",
"connection_modal.test_error.title": "接続テスト失敗の詳細",
- "connection_modal.test.redis_database_list_failure": "接続には成功しましたが、Redis データベース一覧の取得に失敗しました:{{detail}}",
- "connection_modal.test.redis_database_list_timeout": "接続には成功しましたが、Redis データベース一覧の取得がタイムアウトしました(>{{seconds}} 秒)",
"connection_modal.title.create": "新規 {{type}} 接続",
"connection_modal.title.create_description": "接続設定を入力して保存します。",
"connection_modal.title.edit": "接続を編集",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "HTTP Tunnel ホストを入力してください",
"connection_modal.validation.tunnel_port_required": "HTTP Tunnel ポートを入力してください",
"connection_modal.validation.username_required": "ユーザー名を入力してください",
- "connection.backend.action.apply_result_changes": "結果セットの変更を適用",
- "connection.backend.action.clear_table": "テーブルデータを削除",
- "connection.backend.action.create_database": "データベースを作成",
- "connection.backend.action.create_schema": "スキーマを作成",
- "connection.backend.action.data_sync_structure": "同期先の構造変更",
- "connection.backend.action.data_sync_write": "同期データを書き込む",
- "connection.backend.action.drop_database": "データベースを削除",
- "connection.backend.action.drop_function_or_procedure": "関数またはストアドプロシージャを削除",
- "connection.backend.action.drop_schema": "スキーマを削除",
- "connection.backend.action.drop_table": "テーブルを削除",
- "connection.backend.action.drop_view": "ビューを削除",
- "connection.backend.action.import_data": "データをインポート",
- "connection.backend.action.preview_result_changes": "結果セットの変更をプレビュー",
- "connection.backend.action.rename_database": "データベース名を変更",
- "connection.backend.action.rename_schema": "スキーマ名を変更",
- "connection.backend.action.rename_table": "テーブル名を変更",
- "connection.backend.action.rename_view": "ビュー名を変更",
- "connection.backend.action.truncate_table": "テーブルを TRUNCATE",
- "connection.backend.error.readonly_action_blocked": "この接続では本番保護が有効なため、{{action}}は実行できません。",
- "connection.copy_suffix": " - コピー",
- "connection.delete": "接続を削除",
- "connection.edit": "接続を編集",
- "connection.new": "新規接続",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase は MySQL/Oracle テナントプロトコルのみ対応しています。「{{value}}」はサポートされていません。MySQL または Oracle に切り替えてください。",
- "connection.sidebar.delete.backendUnavailable": "接続の削除に失敗しました:バックエンド API を利用できません",
- "connection.sidebar.delete.confirmContent": "接続「{{name}}」を削除しますか?",
- "connection.sidebar.delete.confirmTitle": "削除の確認",
- "connection.sidebar.delete.failureFallback": "接続の削除に失敗しました",
- "connection.sidebar.delete.success": "接続を削除しました",
- "connection.sidebar.disconnect.success": "接続を切断しました",
- "connection.sidebar.duplicate.backendUnavailable": "接続の複製に失敗しました:バックエンド API を利用できません",
- "connection.sidebar.duplicate.failureFallback": "接続の複製に失敗しました",
- "connection.sidebar.duplicate.noResult": "接続の複製に失敗しました:バックエンドから結果が返されませんでした",
- "connection.sidebar.duplicate.success": "接続を複製しました: {{name}}",
- "connection.sidebar.group.badge": "グループ",
- "connection.sidebar.group.collapseAria": "接続グループ {{name}} を折りたたむ",
- "connection.sidebar.group.delete": "グループを削除",
- "connection.sidebar.group.deleteConfirmContent": "グループ「{{name}}」を削除しますか?中の接続は削除されません。",
- "connection.sidebar.group.deleteConfirmTitle": "削除の確認",
- "connection.sidebar.group.edit": "グループを編集",
- "connection.sidebar.group.expandAria": "接続グループ {{name}} を展開",
- "connection.sidebar.group.meta": "{{count}} 件の接続 · 接続グループ",
- "connection.sidebar.group.untitled": "無題のグループ",
- "connection.sidebar.menu.copy": "接続を複製",
- "connection.sidebar.menu.createDatabase": "新規データベース",
- "connection.sidebar.menu.current": "現在",
- "connection.sidebar.menu.delete": "接続を削除",
- "connection.sidebar.menu.disconnect": "接続を切断",
- "connection.sidebar.menu.groupSection": "接続グループ",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "アドレス未設定",
- "connection.sidebar.menu.moveOutTag": "タグから外す",
- "connection.sidebar.menu.moveToTag": "タグへ移動",
- "connection.sidebar.menu.moveToUngrouped": "グループから外す",
- "connection.sidebar.menu.refresh": "接続を更新",
- "connection.sidebar.menu.section": "接続",
- "connection.test": "接続をテスト",
- "connection.unnamed": "名前なしの接続",
"data_export.action.clear": "クリア",
"data_export.action.clear_progress": "現在の進捗をクリア",
"data_export.action.select_all": "すべて選択",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "現在時刻",
"data_grid.cell_editor.title": "セルを編集",
"data_grid.cell_editor.title_with_column": "セルを編集: {{column}}",
+ "data_grid.column.comment_tooltip": "コメント: {{comment}}",
+ "data_grid.column.drag_tooltip": "ドラッグして列を並べ替え",
+ "data_grid.column.foreign_key_jump_title": "外部キーテーブルへ移動: {{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "外部キー: {{target}}",
+ "data_grid.column.resize_tooltip": "ドラッグして列幅を変更、ダブルクリックで自動調整",
+ "data_grid.column.type_tooltip": "型: {{type}}",
"data_grid.column_quick_find.placeholder": "列へジャンプ...",
"data_grid.column_quick_find.tooltip": "列名を入力して Enter キーを押すか、移動ボタンで該当列へジャンプします",
"data_grid.column_settings.column_visibility": "列の表示",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "すべて表示",
"data_grid.column_settings.show_comments": "ヘッダーに列コメントを表示",
"data_grid.column_settings.show_types": "ヘッダーに列型を表示",
- "data_grid.column.comment_tooltip": "コメント: {{comment}}",
- "data_grid.column.drag_tooltip": "ドラッグして列を並べ替え",
- "data_grid.column.foreign_key_jump_title": "外部キーテーブルへ移動: {{tableName}}",
- "data_grid.column.foreign_key_tooltip": "外部キー: {{target}}",
- "data_grid.column.resize_tooltip": "ドラッグして列幅を変更、ダブルクリックで自動調整",
- "data_grid.column.type_tooltip": "型: {{type}}",
"data_grid.context_menu.auto_fit_column": "内容に合わせて列幅を自動調整",
"data_grid.context_menu.clear_column_sort": "このフィールドの並べ替えを解除",
"data_grid.context_menu.column_display_section": "フィールド表示",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "行が選択されていません。エクスポート範囲を選択してください:",
"data_grid.export.options_title": "エクスポートオプション",
"data_grid.export.query_result_title": "クエリ結果をエクスポート",
- "data_grid.export.scope_prompt": "エクスポート範囲を選択してください:",
"data_grid.export.scope.all_results_cached": "すべての結果(現在のキャッシュ {{count}} 件)",
"data_grid.export.scope.all_results_cached_description": "現在のクエリを再実行できない場合は、現在のキャッシュ内のすべての結果をエクスポートします。",
"data_grid.export.scope.all_results_requery": "すべての結果(再クエリ)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "選択した行",
"data_grid.export.scope.selected_rows_count": "選択した行({{count}} 件)",
"data_grid.export.scope.selected_rows_description": "現在の結果セットでチェック済みの行のみをエクスポートします。",
+ "data_grid.export.scope_prompt": "エクスポート範囲を選択してください:",
"data_grid.export.selected_rows": "選択行をエクスポート({{count}} 行)",
"data_grid.filter.add_condition": "条件を追加",
"data_grid.filter.add_sort": "並べ替えを追加",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "移動",
"data_grid.pagination.jump_aria": "移動先ページ",
"data_grid.pagination.jump_label": "ページ移動",
- "data_grid.pagination.page_size_aria": "1 ページあたりの行数",
- "data_grid.pagination.page_size_option": "{{count}} 行 / ページ",
"data_grid.pagination.page.current": "{{current}} ページ",
"data_grid.pagination.page.known": "{{current}} / {{totalPages}} ページ",
+ "data_grid.pagination.page_size_aria": "1 ページあたりの行数",
+ "data_grid.pagination.page_size_option": "{{count}} 行 / ページ",
"data_grid.pagination.result_set": "結果セット",
"data_grid.pagination.summary.approximate": "現在 {{current}} 行 / 約 {{total}} 行",
"data_grid.pagination.summary.cancelled": "現在 {{current}} 行 / 件数取得をキャンセルしました",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "ソースとターゲットを設定",
"data_sync.step.result": "実行結果",
"data_sync.step.select_tables": "テーブルを選択",
- "data_sync.table_picker.help": "同期するテーブルを選択:",
- "data_sync.table_picker.item_unit": "件",
- "data_sync.table_picker.items_unit": "件",
- "data_sync.table_picker.not_found": "データがありません",
- "data_sync.table_picker.search_placeholder": "テーブルを検索...",
- "data_sync.table_picker.selected_title": "選択済みテーブル",
- "data_sync.table_picker.show_same": "同一テーブルを表示",
- "data_sync.table_picker.source_title": "ソーステーブル",
"data_sync.table.delete": "削除",
"data_sync.table.insert": "挿入",
"data_sync.table.plan": "計画",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "なし",
"data_sync.table.target_table": "ターゲットテーブル",
"data_sync.table.update": "更新",
+ "data_sync.table_picker.help": "同期するテーブルを選択:",
+ "data_sync.table_picker.item_unit": "件",
+ "data_sync.table_picker.items_unit": "件",
+ "data_sync.table_picker.not_found": "データがありません",
+ "data_sync.table_picker.search_placeholder": "テーブルを検索...",
+ "data_sync.table_picker.selected_title": "選択済みテーブル",
+ "data_sync.table_picker.show_same": "同一テーブルを表示",
+ "data_sync.table_picker.source_title": "ソーステーブル",
"data_sync.title.compare_result": "比較結果",
"data_sync.title.execution_log": "実行ログ",
"data_sync.title.migration": "クロスデータソース移行",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "データベース接続が見つかりません",
"definition_viewer.error.event_name_empty": "イベント名が空です",
"definition_viewer.error.load_failed": "読み込みに失敗しました",
+ "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.query_failed": "定義の取得に失敗しました",
"definition_viewer.error.query_failed_detail": "定義の取得に失敗しました: {{detail}}",
- "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.routine_name_empty": "関数/ストアドプロシージャ名が空です",
"definition_viewer.error.sequence_name_empty": "Sequence name is empty",
"definition_viewer.error.view_name_empty": "ビュー名が空です",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "旧",
"dev.perf_data_grid.ui_version.v2": "新 UI",
"dev.perf_data_grid.ui_version.v2_short": "新",
+ "driver.guidance.customConnectionDriverHelp": "対応済み: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase。エイリアス: postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。GoNavi に登録済みの Go database/sql ドライバー名を入力してください。システムの ODBC/JDBC ドライバー名を直接入力したり、JDBC Jar を取り込んだりしないでください。",
"driver_manager.action.close": "閉じる",
"driver_manager.action.import_directory": "ドライバーディレクトリを取り込む",
"driver_manager.action.import_package": "ドライバーパッケージを取り込む",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "行内の「ドライバーパッケージを取り込む」は、`mariadb-driver-agent`、`mariadb-driver-agent.exe`、`GoNavi-DriverAgents.zip` などの単一ドライバーファイルまたはバンドル専用です。JDBC Jar の直接取り込みには対応していません。一括取り込みには上の「ドライバーディレクトリを取り込む」を使ってください。",
"driver_manager.local_source.directory": "ディレクトリ",
"driver_manager.local_source.file": "ファイル",
- "driver_manager.log_modal.empty": "このドライバーにはまだ操作ログがありません。",
- "driver_manager.log_modal.executable_path": "ドライバー実行ファイル:{{path}}",
- "driver_manager.log_modal.install_dir": "インストールディレクトリ:{{path}}",
- "driver_manager.log_modal.title": "ドライバーログ - {{name}}",
"driver_manager.log.done_auto_install": "自動インストールが完了しました{{version}}",
"driver_manager.log.done_local_import": "ローカル取り込みインストールが完了しました{{version}}",
"driver_manager.log.done_remove": "ドライバー削除が完了しました",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "自動インストールを開始",
"driver_manager.log.start_local_import": "ローカル取り込みを開始{{version}}({{source}}):{{path}}",
"driver_manager.log.start_remove": "ドライバー削除を開始",
+ "driver_manager.log_modal.empty": "このドライバーにはまだ操作ログがありません。",
+ "driver_manager.log_modal.executable_path": "ドライバー実行ファイル:{{path}}",
+ "driver_manager.log_modal.install_dir": "インストールディレクトリ:{{path}}",
+ "driver_manager.log_modal.title": "ドライバーログ - {{name}}",
"driver_manager.message.directory_import_completed": "ディレクトリ取り込みが完了しました{{mode}}:成功 {{success}}{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "ディレクトリ取り込みが完了しました{{mode}}:成功 {{success}}、失敗 {{failed}}{{skip}}",
"driver_manager.message.directory_import_failed": "ディレクトリ取り込みに失敗しました{{mode}}:失敗 {{failed}}{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "ローカルドライバーパッケージディレクトリの選択に失敗しました:{{detail}}",
"driver_manager.message.select_local_file_failed": "ローカルドライバーパッケージファイルの選択に失敗しました",
"driver_manager.message.select_local_file_failed_detail": "ローカルドライバーパッケージファイルの選択に失敗しました:{{detail}}",
- "driver_manager.message.skip_suffix": "、{{items}}",
"driver_manager.message.skip.dedupe": "重複排除で {{count}} 件スキップ",
"driver_manager.message.skip.slim": "スリム版で {{count}} 件スキップ",
+ "driver_manager.message.skip_suffix": "、{{items}}",
"driver_manager.network.alert.download_chain_unreachable": "重要:ドライバーダウンロード経路のドメインに到達できません",
"driver_manager.network.alert.download_network_unreachable": "重要:ドライバーダウンロードネットワークに到達できません",
"driver_manager.network.chain_alert.allow_hosts": "それでも失敗する場合は、プロキシルールで次を許可してください:{{hosts}}。ルールを調整できない場合は TUN モードの有効化を検討してください。",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "現在 {{installedVersion}} がインストール済みです。{{targetVersion}} を選択しました。「バージョンを切り替え」をクリックすると適用されます。",
"driver_manager.version.target_fallback": "対象バージョン",
"driver_manager.version.unlabeled": "バージョン未記載",
- "driver.guidance.customConnectionDriverHelp": "対応済み: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase。エイリアス: postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。GoNavi に登録済みの Go database/sql ドライバー名を入力してください。システムの ODBC/JDBC ドライバー名を直接入力したり、JDBC Jar を取り込んだりしないでください。",
"file.backend.dialog.export_connections": "接続をエクスポート",
"file.backend.dialog.export_data": "データをエクスポート",
"file.backend.dialog.export_database_sql": "{{database}} をエクスポート (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "データをインポート中...",
"import_preview.status.loading_preview": "プレビューデータを読み込み中...",
"import_preview.title": "インポートデータのプレビュー",
+ "jvm.backend.capability.reason.read_only": "現在の接続は読み取り専用です",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "完全な `http://` または `https://` の URL を入力してください。例: `http://127.0.0.1:19090/gonavi/agent/jvm`。",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 接続に失敗しました: Agent Base URL の形式が正しくありません。",
+ "jvm.backend.connection_error.agent.base_url_required": "Agent 接続に失敗しました: Agent Base URL が未入力です。",
+ "jvm.backend.connection_error.agent.connection_refused.help": "Java サービスが `-javaagent` で GoNavi Agent を起動していることを確認し、Base URL、ポートマッピング、ファイアウォールを確認してください。",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 接続に失敗しました: ターゲット Agent 管理ポートが待ち受けていないか、現在のアドレスに到達できません。",
+ "jvm.backend.connection_error.agent.forbidden.help": "現在のクライアント送信元、認証設定、Agent アクセスポリシーが GoNavi のアクセスを許可しているか確認してください。",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Agent 接続に失敗しました: Agent がこのリクエストを拒否しました。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "Agent Base URL を `http://` または `https://` で始まるアドレスに変更してください。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 接続に失敗しました: HTTP または HTTPS のみサポートされています。",
+ "jvm.backend.connection_error.agent.timeout.help": "ターゲットアドレスに到達できること、Agent が起動済みであることを確認し、必要に応じて接続タイムアウトを増やしてください。",
+ "jvm.backend.connection_error.agent.timeout.summary": "Agent 接続に失敗しました: Agent 管理ポートへのアクセスがタイムアウトしました。",
+ "jvm.backend.connection_error.agent.unauthorized.help": "接続内の Agent API Key がターゲットサービスの起動パラメータと一致するか確認してください。",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 接続に失敗しました: Agent は応答しましたが、API Key が無効または不足しています。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "完全な `http://` または `https://` の URL を入力し、GoNavi JVM HTTP コントラクトを実装する管理 API ルートを指すようにしてください。例: `http://127.0.0.1:19090/manage/jvm`。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 接続に失敗しました: Endpoint Base URL の形式が正しくありません。",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 接続に失敗しました: Endpoint Base URL が未入力です。",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "Base URL が GoNavi JVM HTTP コントラクトを実装する管理 API を指していることを確認し、サービスの待ち受け、ポートマッピング、ファイアウォールを確認してください。",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 接続に失敗しました: ターゲット管理 API が待ち受けていないか、現在のアドレスに到達できません。",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "現在のクライアント送信元、認証設定、アクセスポリシーが GoNavi にこの管理 API へのアクセスを許可しているか確認してください。",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 接続に失敗しました: ターゲット管理 API がこのリクエストを拒否しました。",
+ "jvm.backend.connection_error.endpoint.not_found.help": "Base URL が通常の業務 API、ヘルスチェック、ゲートウェイのトップではなく、JVM 管理 API ルートを指していることを確認してください。",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 接続に失敗しました: ターゲットは応答しましたが、GoNavi JVM 管理 API が見つかりません。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Endpoint Base URL を `http://` または `https://` で始まるアドレスに変更してください。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 接続に失敗しました: HTTP または HTTPS のみサポートされています。",
+ "jvm.backend.connection_error.endpoint.timeout.help": "Base URL に到達できること、ターゲットサービスが起動済みであることを確認し、必要に応じて接続タイムアウトを増やしてください。",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 接続に失敗しました: ターゲット管理 API へのアクセスがタイムアウトしました。",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "接続内の Endpoint API Key がターゲットサービスの設定と一致するか確認してください。",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 接続に失敗しました: ターゲット管理 API は応答しましたが、API Key が無効または不足しています。",
+ "jvm.backend.connection_error.generic": "JVM 接続に失敗しました",
+ "jvm.backend.connection_error.jmx.auth.help": "ターゲット JMX が認証を無効にしているか確認してください。認証が必要な場合は、接続前にユーザー名とパスワードを入力してください。",
+ "jvm.backend.connection_error.jmx.auth.summary": "JMX 接続に失敗しました: {{target}} は認証が必要か、現在の認証情報が無効です。",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "ターゲット JVM でリモート JMX が有効であることを確認し、ホスト、ファイアウォール、ポートマッピング、SSH、プロキシ設定を確認してください。",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 接続に失敗しました: {{target}} に接続できません。ポートが待ち受けていないか、ネットワークに到達できません。",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "設定したポートが JVM の公開 JMX ポートであり、業務ポート、デバッグポート、プロキシ転送ポートではないことを確認してください。",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 接続に失敗しました: {{target}} のサービスが接続を閉じました。このポートは互換性のある標準 JMX RMI ポートではありません。",
+ "jvm.backend.connection_error.jmx.host_required": "JMX 接続に失敗しました: ホストが未入力です。",
+ "jvm.backend.connection_error.jmx.java_missing.help": "先に JRE/JDK をインストールするか、環境変数 `GONAVI_JMX_JAVA_BIN` で正しい `java` 実行ファイルを指定してください。",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 接続に失敗しました: 現在のマシンで `java` runtime が見つからないため、GoNavi は JMX helper を起動できません。",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "これは通常、RMI レジストリ、デバッグポート、または別の Java サービスポートを指定していることを意味します。`jmxremote.port` と `jmxremote.rmi.port` の設定を確認してください。",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 接続に失敗しました: {{target}} には RMI サービスがありますが、利用可能な JMX RMIServer ポートではありません。",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "業務 `server.port` ではなく、アプリケーションが実際に公開している JMX ポートを指定してください。サービスが `-Dcom.sun.management.jmxremote` のみ有効で `jmxremote.port` を設定していない場合も、直接リモート接続はできません。",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 接続に失敗しました: {{target}} は標準の JMX リモート管理ポートではなく、業務ポートまたは HTTP ポートのように見えます。",
+ "jvm.backend.connection_error.jmx.port_invalid": "JMX 接続に失敗しました: ポートが無効です。1-65535 の有効なポートを入力してください。",
+ "jvm.backend.connection_error.jmx.timeout.help": "ポートに到達できること、ネットワークがブロックされていないことを確認し、必要に応じて接続タイムアウトを増やしてください。",
+ "jvm.backend.connection_error.jmx.timeout.summary": "JMX 接続に失敗しました: {{target}} への接続がタイムアウトしました。",
+ "jvm.backend.connection_error.suggestion": "提案: {{detail}}",
+ "jvm.backend.connection_error.technical_detail": "技術詳細: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel のアドレスが不正です: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel のアドレスが必要です",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "この Arthas Tunnel セッションのアクティブコマンドはキャンセル対象コマンドと一致しません。",
+ "jvm.backend.diagnostic.arthas.command_already_running": "この Arthas Tunnel セッションではすでにコマンドが実行中です。完了を待つか先にキャンセルしてください。",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel コマンドはキャンセルされました",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel コマンドは {{timeout}} でタイムアウトしました",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket 接続はキャンセルされました",
+ "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket 接続に失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket 接続は {{timeout}} 応答がなくタイムアウトしました",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 接続が閉じられました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 接続が閉じられました: code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 接続はまだ準備できていません。後でもう一度試してください。",
+ "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 接続に失敗しました: HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "この Arthas Tunnel セッションには実行中のコマンドがありません。",
+ "jvm.backend.diagnostic.arthas.read_canceled": "Arthas Tunnel 出力の読み取りはキャンセルされました",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel の読み取り期限設定に失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "Arthas Tunnel 出力の読み取りに失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "Arthas Tunnel 出力の読み取りは {{timeout}} 応答がなくタイムアウトしました",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel リクエストのエンコードに失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel は http/https/ws/wss アドレスのみサポートします: {{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "Arthas Tunnel 端末コマンドの送信はキャンセルされました",
+ "jvm.backend.diagnostic.arthas.send_failed": "Arthas Tunnel 端末コマンドの送信に失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "Arthas Tunnel 端末コマンドの送信は {{timeout}} 応答がなくタイムアウトしました",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel セッション設定が変更されています。診断セッションを再作成してください。",
+ "jvm.backend.diagnostic.arthas.session_missing": "診断セッションが存在しません。Arthas Tunnel セッションを再作成してください。",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel の target ID が必要です (targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "ターゲットインスタンスが見つかりません。targetId / agentId が正しいことと、対応する tunnel client がオンラインであることを確認してください。",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "ターゲットインスタンス {{target}} が見つかりません。targetId / agentId が正しいことと、対応する tunnel client がオンラインであることを確認してください。",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 端末コマンドのエンコードに失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel の書き込み期限設定に失敗しました: {{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "診断監査レコードの書き込みに失敗したため、コマンド実行をブロックしました: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "キャンセルコマンドには sessionId と commandId が必要です",
+ "jvm.backend.diagnostic.error.command_required": "診断コマンドは空にできません",
+ "jvm.backend.diagnostic.error.disabled": "この接続では JVM 診断強化モードが有効ではありません",
+ "jvm.backend.diagnostic.error.execute_canceled": "診断実行リクエストがキャンセルされました: {{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "診断セッション ID が必要です。先にセッションを作成してください。",
+ "jvm.backend.diagnostic.error.transport_unsupported": "サポートされていない JVM 診断トランスポートです: {{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas コマンドはキャンセルされました",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas コマンドの実行が完了しました",
+ "jvm.backend.diagnostic.message.cancel_requested": "キャンセルリクエストを送信しました。診断ブリッジ側でコマンドが終了するのを待っています",
+ "jvm.backend.diagnostic.message.command_completed": "診断コマンドの実行が完了しました",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "診断コマンドは改行または複数コマンド入力をサポートしていません",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "この接続では高リスク診断コマンドが有効ではありません: {{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "この接続では観察系診断コマンドが有効ではありません: {{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "現在の接続は読み取り専用です。観察系診断コマンドのみ許可されます",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "この接続ではトレース系診断コマンドが有効ではありません: {{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "監査レコードの書き込みに失敗しました: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "監査レコードの書き込みに失敗したため、JVM 変更をブロックしました: {{detail}}",
+ "jvm.backend.error.change_action_required": "JVM 変更アクションが必要です",
+ "jvm.backend.error.change_blocked_by_guard": "現在の変更は Guard によってブロックされました",
+ "jvm.backend.error.change_blocked_read_only": "現在の接続は読み取り専用のため、書き込みはブロックされます",
+ "jvm.backend.error.change_confirmation_token_failed": "JVM 変更確認トークンの生成に失敗しました: {{detail}}",
+ "jvm.backend.error.change_reason_required": "JVM 変更理由が必要です",
+ "jvm.backend.error.change_resource_id_required": "JVM リソース ID が必要です",
+ "jvm.backend.error.confirmation_token_expired": "確認トークンの有効期限が切れました。もう一度プレビューして確認してください。",
+ "jvm.backend.error.confirmation_token_invalid": "確認トークンが無効です。もう一度プレビューして確認してください。",
+ "jvm.backend.error.confirmation_token_missing": "確認トークンがありません。先にプレビュー確認を完了してください。",
+ "jvm.backend.error.disallowed_mode": "現在の接続では {{mode}} モードを使用できません",
+ "jvm.backend.error.preview_confirmation_missing": "プレビュー確認トークンがありません。もう一度プレビューしてから送信してください。",
+ "jvm.backend.error.preview_context_hash_failed": "JVM プレビューコンテキストの生成に失敗しました: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "JVM プレビュー Payload ダイジェストの生成に失敗しました: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "JVM リソースパスが無効です: {{detail}}",
+ "jvm.backend.message.connect_success": "JVM 接続に成功しました",
+ "jvm.backend.monitoring.error.session_not_found": "{{connectionId}} {{providerMode}} の JVM 監視セッションが見つかりません",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 監視スナップショットはまだサポートされていません",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "監視サンプリングが {{count}} 回連続で失敗したため、このセッションは自動停止されました",
+ "jvm.backend.separator.message_warning": ";",
+ "jvm.backend.warning.failed_audit_write_failed": "失敗監査レコードの書き込みに失敗しました: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "終端監査レコードの書き込みに失敗しました: {{detail}}",
"jvm_ai_plan.actions.description": ":{{description}}",
"jvm_ai_plan.actions.field_separator": "、",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "AI 診断プラン:{{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "AI プランの診断 transport は {{planTransport}} ですが、現在のコンソール {{currentTransport}} と一致しません。プランを再生成してから適用してください。",
"jvm_diagnostic.ai_plan.message.filled": "AI 診断プランをコンソールに反映しました",
+ "jvm_diagnostic.capability.empty.description": "能力確認はチャネル権限とコマンドポリシーだけを読み取り、セッション作成やコマンド実行は行いません。",
+ "jvm_diagnostic.capability.empty.title": "能力は未確認です",
"jvm_diagnostic.capability_result.mutating_allowed": "高リスクコマンド",
"jvm_diagnostic.capability_result.observe_allowed": "Observe コマンド",
"jvm_diagnostic.capability_result.observe_denied": "Observe 禁止",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "ストリーミング非対応",
"jvm_diagnostic.capability_result.title": "能力確認結果",
"jvm_diagnostic.capability_result.trace_allowed": "Trace コマンド",
- "jvm_diagnostic.capability.empty.description": "能力確認はチャネル権限とコマンドポリシーだけを読み取り、セッション作成やコマンド実行は行いません。",
- "jvm_diagnostic.capability.empty.title": "能力は未確認です",
"jvm_diagnostic.command_input.command_description": "Arthas/診断コマンドを入力します。例: thread -n 5、dashboard、jvm。下のテンプレートでワンクリック入力できます。",
"jvm_diagnostic.command_input.command_label": "診断コマンド",
"jvm_diagnostic.command_input.description": "自動補完に対応しています。Ctrl/Cmd + Enter で実行します。",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "手動入力",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "コンソールから開始したセッション",
+ "jvm_diagnostic.session.default_title": "JVM 診断コンソール",
"jvm_diagnostic.session_capability.action.clear_output": "出力をクリア",
"jvm_diagnostic.session_capability.action.refresh_history": "履歴を再読み込み",
"jvm_diagnostic.session_capability.description": "現在のチャネル、権限、クイックメンテナンス",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "セッションなし",
"jvm_diagnostic.session_capability.status.session_established": "セッション確立済み",
"jvm_diagnostic.session_capability.title": "セッションと能力",
- "jvm_diagnostic.session.default_reason": "コンソールから開始したセッション",
- "jvm_diagnostic.session.default_title": "JVM 診断コンソール",
"jvm_diagnostic.workbench.action.cancel_command": "コマンドをキャンセル",
"jvm_diagnostic.workbench.action.execute_command": "コマンドを実行",
"jvm_diagnostic.workbench.action.probe": "能力を確認",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "リソース値",
"jvm_resource.section.supported_actions": "リソースでサポートされる操作",
"jvm_resource.title": "JVM リソースワークベンチ",
- "jvm.backend.capability.reason.read_only": "現在の接続は読み取り専用です",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "完全な `http://` または `https://` の URL を入力してください。例: `http://127.0.0.1:19090/gonavi/agent/jvm`。",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 接続に失敗しました: Agent Base URL の形式が正しくありません。",
- "jvm.backend.connection_error.agent.base_url_required": "Agent 接続に失敗しました: Agent Base URL が未入力です。",
- "jvm.backend.connection_error.agent.connection_refused.help": "Java サービスが `-javaagent` で GoNavi Agent を起動していることを確認し、Base URL、ポートマッピング、ファイアウォールを確認してください。",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 接続に失敗しました: ターゲット Agent 管理ポートが待ち受けていないか、現在のアドレスに到達できません。",
- "jvm.backend.connection_error.agent.forbidden.help": "現在のクライアント送信元、認証設定、Agent アクセスポリシーが GoNavi のアクセスを許可しているか確認してください。",
- "jvm.backend.connection_error.agent.forbidden.summary": "Agent 接続に失敗しました: Agent がこのリクエストを拒否しました。",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "Agent Base URL を `http://` または `https://` で始まるアドレスに変更してください。",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 接続に失敗しました: HTTP または HTTPS のみサポートされています。",
- "jvm.backend.connection_error.agent.timeout.help": "ターゲットアドレスに到達できること、Agent が起動済みであることを確認し、必要に応じて接続タイムアウトを増やしてください。",
- "jvm.backend.connection_error.agent.timeout.summary": "Agent 接続に失敗しました: Agent 管理ポートへのアクセスがタイムアウトしました。",
- "jvm.backend.connection_error.agent.unauthorized.help": "接続内の Agent API Key がターゲットサービスの起動パラメータと一致するか確認してください。",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 接続に失敗しました: Agent は応答しましたが、API Key が無効または不足しています。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "完全な `http://` または `https://` の URL を入力し、GoNavi JVM HTTP コントラクトを実装する管理 API ルートを指すようにしてください。例: `http://127.0.0.1:19090/manage/jvm`。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 接続に失敗しました: Endpoint Base URL の形式が正しくありません。",
- "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 接続に失敗しました: Endpoint Base URL が未入力です。",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "Base URL が GoNavi JVM HTTP コントラクトを実装する管理 API を指していることを確認し、サービスの待ち受け、ポートマッピング、ファイアウォールを確認してください。",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 接続に失敗しました: ターゲット管理 API が待ち受けていないか、現在のアドレスに到達できません。",
- "jvm.backend.connection_error.endpoint.forbidden.help": "現在のクライアント送信元、認証設定、アクセスポリシーが GoNavi にこの管理 API へのアクセスを許可しているか確認してください。",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 接続に失敗しました: ターゲット管理 API がこのリクエストを拒否しました。",
- "jvm.backend.connection_error.endpoint.not_found.help": "Base URL が通常の業務 API、ヘルスチェック、ゲートウェイのトップではなく、JVM 管理 API ルートを指していることを確認してください。",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 接続に失敗しました: ターゲットは応答しましたが、GoNavi JVM 管理 API が見つかりません。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Endpoint Base URL を `http://` または `https://` で始まるアドレスに変更してください。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 接続に失敗しました: HTTP または HTTPS のみサポートされています。",
- "jvm.backend.connection_error.endpoint.timeout.help": "Base URL に到達できること、ターゲットサービスが起動済みであることを確認し、必要に応じて接続タイムアウトを増やしてください。",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 接続に失敗しました: ターゲット管理 API へのアクセスがタイムアウトしました。",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "接続内の Endpoint API Key がターゲットサービスの設定と一致するか確認してください。",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 接続に失敗しました: ターゲット管理 API は応答しましたが、API Key が無効または不足しています。",
- "jvm.backend.connection_error.generic": "JVM 接続に失敗しました",
- "jvm.backend.connection_error.jmx.auth.help": "ターゲット JMX が認証を無効にしているか確認してください。認証が必要な場合は、接続前にユーザー名とパスワードを入力してください。",
- "jvm.backend.connection_error.jmx.auth.summary": "JMX 接続に失敗しました: {{target}} は認証が必要か、現在の認証情報が無効です。",
- "jvm.backend.connection_error.jmx.connection_refused.help": "ターゲット JVM でリモート JMX が有効であることを確認し、ホスト、ファイアウォール、ポートマッピング、SSH、プロキシ設定を確認してください。",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 接続に失敗しました: {{target}} に接続できません。ポートが待ち受けていないか、ネットワークに到達できません。",
- "jvm.backend.connection_error.jmx.connection_reset.help": "設定したポートが JVM の公開 JMX ポートであり、業務ポート、デバッグポート、プロキシ転送ポートではないことを確認してください。",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 接続に失敗しました: {{target}} のサービスが接続を閉じました。このポートは互換性のある標準 JMX RMI ポートではありません。",
- "jvm.backend.connection_error.jmx.host_required": "JMX 接続に失敗しました: ホストが未入力です。",
- "jvm.backend.connection_error.jmx.java_missing.help": "先に JRE/JDK をインストールするか、環境変数 `GONAVI_JMX_JAVA_BIN` で正しい `java` 実行ファイルを指定してください。",
- "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 接続に失敗しました: 現在のマシンで `java` runtime が見つからないため、GoNavi は JMX helper を起動できません。",
- "jvm.backend.connection_error.jmx.no_such_object.help": "これは通常、RMI レジストリ、デバッグポート、または別の Java サービスポートを指定していることを意味します。`jmxremote.port` と `jmxremote.rmi.port` の設定を確認してください。",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 接続に失敗しました: {{target}} には RMI サービスがありますが、利用可能な JMX RMIServer ポートではありません。",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "業務 `server.port` ではなく、アプリケーションが実際に公開している JMX ポートを指定してください。サービスが `-Dcom.sun.management.jmxremote` のみ有効で `jmxremote.port` を設定していない場合も、直接リモート接続はできません。",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 接続に失敗しました: {{target}} は標準の JMX リモート管理ポートではなく、業務ポートまたは HTTP ポートのように見えます。",
- "jvm.backend.connection_error.jmx.port_invalid": "JMX 接続に失敗しました: ポートが無効です。1-65535 の有効なポートを入力してください。",
- "jvm.backend.connection_error.jmx.timeout.help": "ポートに到達できること、ネットワークがブロックされていないことを確認し、必要に応じて接続タイムアウトを増やしてください。",
- "jvm.backend.connection_error.jmx.timeout.summary": "JMX 接続に失敗しました: {{target}} への接続がタイムアウトしました。",
- "jvm.backend.connection_error.suggestion": "提案: {{detail}}",
- "jvm.backend.connection_error.technical_detail": "技術詳細: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel のアドレスが不正です: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel のアドレスが必要です",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "この Arthas Tunnel セッションのアクティブコマンドはキャンセル対象コマンドと一致しません。",
- "jvm.backend.diagnostic.arthas.command_already_running": "この Arthas Tunnel セッションではすでにコマンドが実行中です。完了を待つか先にキャンセルしてください。",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel コマンドはキャンセルされました",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel コマンドは {{timeout}} でタイムアウトしました",
- "jvm.backend.diagnostic.arthas.connect_canceled": "Arthas Tunnel WebSocket 接続はキャンセルされました",
- "jvm.backend.diagnostic.arthas.connect_failed": "Arthas Tunnel WebSocket 接続に失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "Arthas Tunnel WebSocket 接続は {{timeout}} 応答がなくタイムアウトしました",
- "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 接続が閉じられました: {{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 接続が閉じられました: code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 接続はまだ準備できていません。後でもう一度試してください。",
- "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 接続に失敗しました: HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "この Arthas Tunnel セッションには実行中のコマンドがありません。",
- "jvm.backend.diagnostic.arthas.read_canceled": "Arthas Tunnel 出力の読み取りはキャンセルされました",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel の読み取り期限設定に失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "Arthas Tunnel 出力の読み取りに失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "Arthas Tunnel 出力の読み取りは {{timeout}} 応答がなくタイムアウトしました",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel リクエストのエンコードに失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel は http/https/ws/wss アドレスのみサポートします: {{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "Arthas Tunnel 端末コマンドの送信はキャンセルされました",
- "jvm.backend.diagnostic.arthas.send_failed": "Arthas Tunnel 端末コマンドの送信に失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "Arthas Tunnel 端末コマンドの送信は {{timeout}} 応答がなくタイムアウトしました",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel セッション設定が変更されています。診断セッションを再作成してください。",
- "jvm.backend.diagnostic.arthas.session_missing": "診断セッションが存在しません。Arthas Tunnel セッションを再作成してください。",
- "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel の target ID が必要です (targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "ターゲットインスタンスが見つかりません。targetId / agentId が正しいことと、対応する tunnel client がオンラインであることを確認してください。",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "ターゲットインスタンス {{target}} が見つかりません。targetId / agentId が正しいことと、対応する tunnel client がオンラインであることを確認してください。",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 端末コマンドのエンコードに失敗しました: {{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel の書き込み期限設定に失敗しました: {{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "診断監査レコードの書き込みに失敗したため、コマンド実行をブロックしました: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "キャンセルコマンドには sessionId と commandId が必要です",
- "jvm.backend.diagnostic.error.command_required": "診断コマンドは空にできません",
- "jvm.backend.diagnostic.error.disabled": "この接続では JVM 診断強化モードが有効ではありません",
- "jvm.backend.diagnostic.error.execute_canceled": "診断実行リクエストがキャンセルされました: {{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "診断セッション ID が必要です。先にセッションを作成してください。",
- "jvm.backend.diagnostic.error.transport_unsupported": "サポートされていない JVM 診断トランスポートです: {{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas コマンドはキャンセルされました",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas コマンドの実行が完了しました",
- "jvm.backend.diagnostic.message.cancel_requested": "キャンセルリクエストを送信しました。診断ブリッジ側でコマンドが終了するのを待っています",
- "jvm.backend.diagnostic.message.command_completed": "診断コマンドの実行が完了しました",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "診断コマンドは改行または複数コマンド入力をサポートしていません",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "この接続では高リスク診断コマンドが有効ではありません: {{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "この接続では観察系診断コマンドが有効ではありません: {{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "現在の接続は読み取り専用です。観察系診断コマンドのみ許可されます",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "この接続ではトレース系診断コマンドが有効ではありません: {{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "監査レコードの書き込みに失敗しました: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "監査レコードの書き込みに失敗したため、JVM 変更をブロックしました: {{detail}}",
- "jvm.backend.error.change_action_required": "JVM 変更アクションが必要です",
- "jvm.backend.error.change_blocked_by_guard": "現在の変更は Guard によってブロックされました",
- "jvm.backend.error.change_blocked_read_only": "現在の接続は読み取り専用のため、書き込みはブロックされます",
- "jvm.backend.error.change_confirmation_token_failed": "JVM 変更確認トークンの生成に失敗しました: {{detail}}",
- "jvm.backend.error.change_reason_required": "JVM 変更理由が必要です",
- "jvm.backend.error.change_resource_id_required": "JVM リソース ID が必要です",
- "jvm.backend.error.confirmation_token_expired": "確認トークンの有効期限が切れました。もう一度プレビューして確認してください。",
- "jvm.backend.error.confirmation_token_invalid": "確認トークンが無効です。もう一度プレビューして確認してください。",
- "jvm.backend.error.confirmation_token_missing": "確認トークンがありません。先にプレビュー確認を完了してください。",
- "jvm.backend.error.disallowed_mode": "現在の接続では {{mode}} モードを使用できません",
- "jvm.backend.error.preview_confirmation_missing": "プレビュー確認トークンがありません。もう一度プレビューしてから送信してください。",
- "jvm.backend.error.preview_context_hash_failed": "JVM プレビューコンテキストの生成に失敗しました: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "JVM プレビュー Payload ダイジェストの生成に失敗しました: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "JVM リソースパスが無効です: {{detail}}",
- "jvm.backend.message.connect_success": "JVM 接続に成功しました",
- "jvm.backend.monitoring.error.session_not_found": "{{connectionId}} {{providerMode}} の JVM 監視セッションが見つかりません",
- "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 監視スナップショットはまだサポートされていません",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "監視サンプリングが {{count}} 回連続で失敗したため、このセッションは自動停止されました",
- "jvm.backend.separator.message_warning": ";",
- "jvm.backend.warning.failed_audit_write_failed": "失敗監査レコードの書き込みに失敗しました: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "終端監査レコードの書き込みに失敗しました: {{detail}}",
"log_panel.action.clear": "ログをクリア",
"log_panel.action.close": "パネルを閉じる",
"log_panel.affected_rows": "影響行数: {{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "SQL 実行ログはありません",
"log_panel.short_title": "ログ",
"log_panel.title": "SQL 実行ログ",
- "message_publish_modal.action.send": "送信",
- "message_publish_modal.error.build_command_failed": "送信コマンドの作成に失敗しました",
- "message_publish_modal.error.send_failed_detail": "送信に失敗しました: {{detail}}",
- "message_publish_modal.error.unknown_error": "不明なエラー",
- "message_publish_modal.field.body_mode.label": "メッセージ本文タイプ",
- "message_publish_modal.field.body.extra": "JSON モードでは有効な JSON が必要です。テキストモードでは内容をそのまま送信します。",
- "message_publish_modal.field.body.label": "メッセージ本文",
- "message_publish_modal.field.body.placeholder": "メッセージ本文を入力してください",
- "message_publish_modal.field.body.required": "メッセージ本文を入力してください",
- "message_publish_modal.field.delay_level.extra": "RocketMQ は固定の遅延レベルを使用します。0 は即時送信です。",
- "message_publish_modal.field.delay_level.label": "Delay Level(任意)",
- "message_publish_modal.field.exchange.extra": "空のままにすると既定の exchange を使用します。カスタム exchange を入力する場合は、対象 Queue に binding があることを確認してください。",
- "message_publish_modal.field.exchange.label": "Exchange(任意)",
- "message_publish_modal.field.exchange.placeholder": "例:events.topic",
- "message_publish_modal.field.headers.extra": "JSON オブジェクトである必要があります。例:{{example}}。",
- "message_publish_modal.field.headers.label": "Headers(任意)",
- "message_publish_modal.field.properties.extra": "JSON オブジェクトである必要があります。例:{{example}}。",
- "message_publish_modal.field.properties.label": "Properties(任意)",
- "message_publish_modal.field.qos.extra": "0 は at most once、1 は at least once、2 は exactly once です。",
- "message_publish_modal.field.retain.label": "Retain メッセージ",
- "message_publish_modal.field.routing_key.extra": "空のままにすると現在の Queue 名を既定で使用します。",
- "message_publish_modal.field.routing_key.label": "Routing Key(任意)",
- "message_publish_modal.field.routing_key.placeholder": "例:orders.queue",
- "message_publish_modal.field.tag.extra": "空のままにすると Tag によるフィルタや書き込みを行いません。",
- "message_publish_modal.field.tag.label": "Tag(任意)",
- "message_publish_modal.footer.success_prefix": "送信に成功すると",
- "message_publish_modal.footer.success_suffix": " が返り、このテストメッセージが送信されたか確認できます。",
- "message_publish_modal.option.no_delay": "遅延なし",
- "message_publish_modal.option.text": "テキスト",
- "message_publish_modal.title": "メッセージ送信テスト",
- "message_publish_modal.title_with_connection": "メッセージ送信テスト · {{connectionName}}",
"message_publish.error.destination_required": "送信先 Topic / Queue を入力してください",
"message_publish.error.invalid_json_detail": "{{field}} は有効な JSON ではありません:{{detail}}",
"message_publish.error.json_object_required": "{{field}} は JSON オブジェクトである必要があります",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag、Keys、Delay Level、Properties は RocketMQ メッセージ属性に一緒に書き込まれます。",
"message_publish.presentation.rocketmq.tag_placeholder": "例:TagA",
"message_publish.presentation.topic_required": "Topic を入力してください",
+ "message_publish_modal.action.send": "送信",
+ "message_publish_modal.error.build_command_failed": "送信コマンドの作成に失敗しました",
+ "message_publish_modal.error.send_failed_detail": "送信に失敗しました: {{detail}}",
+ "message_publish_modal.error.unknown_error": "不明なエラー",
+ "message_publish_modal.field.body.extra": "JSON モードでは有効な JSON が必要です。テキストモードでは内容をそのまま送信します。",
+ "message_publish_modal.field.body.label": "メッセージ本文",
+ "message_publish_modal.field.body.placeholder": "メッセージ本文を入力してください",
+ "message_publish_modal.field.body.required": "メッセージ本文を入力してください",
+ "message_publish_modal.field.body_mode.label": "メッセージ本文タイプ",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ は固定の遅延レベルを使用します。0 は即時送信です。",
+ "message_publish_modal.field.delay_level.label": "Delay Level(任意)",
+ "message_publish_modal.field.exchange.extra": "空のままにすると既定の exchange を使用します。カスタム exchange を入力する場合は、対象 Queue に binding があることを確認してください。",
+ "message_publish_modal.field.exchange.label": "Exchange(任意)",
+ "message_publish_modal.field.exchange.placeholder": "例:events.topic",
+ "message_publish_modal.field.headers.extra": "JSON オブジェクトである必要があります。例:{{example}}。",
+ "message_publish_modal.field.headers.label": "Headers(任意)",
+ "message_publish_modal.field.properties.extra": "JSON オブジェクトである必要があります。例:{{example}}。",
+ "message_publish_modal.field.properties.label": "Properties(任意)",
+ "message_publish_modal.field.qos.extra": "0 は at most once、1 は at least once、2 は exactly once です。",
+ "message_publish_modal.field.retain.label": "Retain メッセージ",
+ "message_publish_modal.field.routing_key.extra": "空のままにすると現在の Queue 名を既定で使用します。",
+ "message_publish_modal.field.routing_key.label": "Routing Key(任意)",
+ "message_publish_modal.field.routing_key.placeholder": "例:orders.queue",
+ "message_publish_modal.field.tag.extra": "空のままにすると Tag によるフィルタや書き込みを行いません。",
+ "message_publish_modal.field.tag.label": "Tag(任意)",
+ "message_publish_modal.footer.success_prefix": "送信に成功すると",
+ "message_publish_modal.footer.success_suffix": " が返り、このテストメッセージが送信されたか確認できます。",
+ "message_publish_modal.option.no_delay": "遅延なし",
+ "message_publish_modal.option.text": "テキスト",
+ "message_publish_modal.title": "メッセージ送信テスト",
+ "message_publish_modal.title_with_connection": "メッセージ送信テスト · {{connectionName}}",
"proxy.backend.error.host_empty": "プロキシホストが空です",
"proxy.backend.error.http_connect_failed": "HTTP プロキシへの接続に失敗しました: {{detail}}",
"proxy.backend.error.http_connect_read_failed": "HTTP CONNECT レスポンスの読み取りに失敗しました: {{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "SOCKS5 プロキシ接続に失敗しました: {{detail}}",
"proxy.backend.error.socks5_dialer_failed": "SOCKS5 プロキシダイヤラーの作成に失敗しました: {{detail}}",
"proxy.backend.error.unsupported_type": "サポートされていないプロキシ種別: {{type}}",
+ "query.format": "SQL を整形",
+ "query.new": "新規クエリ",
+ "query.run": "実行",
+ "query.save": "クエリを保存",
+ "query.stop": "停止",
"query_editor.action.ai_explain_sql": "AI で SQL を説明",
"query_editor.action.ai_explain_sql_menu": "SQL を説明",
"query_editor.action.ai_generate_sql": "AI で SQL を生成",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "スキーマ分析",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "SQL ファイルをエクスポート",
- "query_editor.action.format": "整形",
"query_editor.action.find_in_editor": "検索",
"query_editor.action.find_in_editor_with_shortcut": "エディター内を検索({{shortcut}})",
+ "query_editor.action.format": "整形",
"query_editor.action.format_sql": "SQL を整形",
"query_editor.action.format_sql_with_shortcut": "SQL を整形({{shortcut}})",
"query_editor.action.hide_results_panel": "結果エリアを非表示",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "最大行数: 5000",
"query_editor.max_rows.option_unlimited": "最大行数: 無制限",
"query_editor.max_rows.tooltip": "最大返却行数。SELECT には自動で LIMIT を付け、大きすぎる結果セットで UI が固まるのを防ぎます。",
+ "query_editor.message.ai_model_missing": "現在の AI Provider でモデルが選択されていません。先に AI 設定でモデルを選択してください。",
+ "query_editor.message.ai_provider_missing": "先に AI 設定で AI Provider を設定して有効化してください。",
+ "query_editor.message.ai_service_unavailable": "AI サービスの準備ができていません。後でもう一度試すか、AI 設定を確認してください。",
"query_editor.message.append_success": "コードを追記しました。",
"query_editor.message.cancel_failed": "クエリのキャンセルに失敗しました: {{error}}",
"query_editor.message.cancel_no_running": "キャンセルできる実行中のクエリはありません。",
"query_editor.message.cancel_success": "クエリをキャンセルしました。",
"query_editor.message.connection_not_found": "接続が見つかりません。",
"query_editor.message.connection_readonly_blocked": "この接続では本番保護が有効なため、問い合わせ操作のみ実行できます。",
+ "query_editor.message.current_line_no_copyable_content": "現在の行にコピーできる内容がありません。",
"query_editor.message.execution_failed_with_error": "クエリ実行に失敗しました: {{error}}",
"query_editor.message.execution_multi_success": "{{statements}} 個のステートメントを実行し、{{results}} 個の結果セットを生成しました。",
"query_editor.message.execution_result_sets_success": "実行が完了し、{{results}} 個の結果セットを生成しました。",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "整形に失敗しました: SQL 構文が正しくない可能性があります。",
"query_editor.message.format_restore_success": "整形前の SQL に戻しました。",
"query_editor.message.insert_success": "現在のカーソル位置にコードを挿入しました。",
- "query_editor.message.ai_model_missing": "現在の AI Provider でモデルが選択されていません。先に AI 設定でモデルを選択してください。",
- "query_editor.message.ai_provider_missing": "先に AI 設定で AI Provider を設定して有効化してください。",
- "query_editor.message.ai_service_unavailable": "AI サービスの準備ができていません。後でもう一度試すか、AI 設定を確認してください。",
"query_editor.message.no_executable_sql": "実行できる SQL がありません。",
"query_editor.message.no_format_restore_snapshot": "元に戻せる整形前の SQL はありません。",
- "query_editor.message.current_line_no_copyable_content": "現在の行にコピーできる内容がありません。",
"query_editor.message.no_selectable_sql": "選択できる SQL ステートメントがありません。",
"query_editor.message.object_info_target_not_found": "現在のカーソル位置に認識できるテーブルまたはカラムがありません。",
"query_editor.message.page_query_empty": "ページ取得で結果セットが返されませんでした。",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "結果 {{index}} ✓",
"query_editor.results_panel.action.hide": "非表示",
"query_editor.results_panel.aria.hide": "結果エリアを非表示",
+ "query_editor.results_panel.detached.close": "ウィンドウを閉じる",
+ "query_editor.results_panel.detached.restore": "結果タブに戻す",
+ "query_editor.results_panel.detached.title": "結果 {{index}}",
"query_editor.results_panel.menu.close_all": "すべて閉じる",
"query_editor.results_panel.menu.close_left": "左側のタブを閉じる",
"query_editor.results_panel.menu.close_other": "他のタブを閉じる",
"query_editor.results_panel.menu.close_right": "右側のタブを閉じる",
+ "query_editor.results_panel.menu.open_in_window": "フローティングウィンドウで開く",
+ "query_editor.results_panel.menu.restore_to_tab": "結果タブに戻す",
"query_editor.results_panel.message.action.copy": "コピー",
"query_editor.results_panel.message.copy_failed": "メッセージのコピーに失敗しました: {{detail}}",
"query_editor.results_panel.message.copy_unsupported": "現在の環境ではクリップボードへコピーできません",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "クエリ名を変更",
"query_editor.save_modal.title": "クエリを保存",
"query_editor.save_modal.unnamed": "無題のクエリ",
- "query_editor.snippet_picker.description": "既存の SQL スニペットを選び、現在のカーソル位置に挿入します。",
- "query_editor.snippet_picker.empty": "利用可能な SQL スニペットがまだありません。スニペット設定から追加または既定を復元してください。",
- "query_editor.snippet_picker.empty_filtered": "条件に一致する SQL スニペットが見つかりません。",
- "query_editor.snippet_picker.manage": "スニペットを管理",
- "query_editor.snippet_picker.search_placeholder": "プレフィックス、名前、内容で検索",
- "query_editor.snippet_picker.title": "SQL スニペットを挿入",
"query_editor.slash_command.diff.description": "テーブル差分を比較して変更を生成",
"query_editor.slash_command.diff.label": "テーブル比較",
"query_editor.slash_command.diff.prompt": "2 つのテーブル構造の差分を比較し、旧版から新版へ移行する ALTER 文を生成してください。",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "要件を説明してステートメントを生成",
"query_editor.slash_command.sql.label": "SQL を生成",
"query_editor.slash_command.sql.prompt": "次の要件に対する SQL を生成してください:",
- "query_editor.text_to_sql.description": "クエリまたは処理したいデータを説明してください。GoNavi は現在の接続、データベース、読み込み済みスキーマを使って SQL を生成します。",
- "query_editor.text_to_sql.generate": "SQL を生成",
- "query_editor.text_to_sql.mode.insert": "カーソル位置に挿入",
- "query_editor.text_to_sql.mode.replace_all": "全文を置換",
- "query_editor.text_to_sql.mode.replace_selection": "選択範囲を置換",
- "query_editor.text_to_sql.placeholder": "例: 直近 30 日間の日別注文金額を集計し、日付の昇順で返す",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "既存の SQL スニペットを選び、現在のカーソル位置に挿入します。",
+ "query_editor.snippet_picker.empty": "利用可能な SQL スニペットがまだありません。スニペット設定から追加または既定を復元してください。",
+ "query_editor.snippet_picker.empty_filtered": "条件に一致する SQL スニペットが見つかりません。",
+ "query_editor.snippet_picker.manage": "スニペットを管理",
+ "query_editor.snippet_picker.search_placeholder": "プレフィックス、名前、内容で検索",
+ "query_editor.snippet_picker.title": "SQL スニペットを挿入",
"query_editor.sql_error.rule.column_missing.explanation": "SQL が、結果セットに存在しない、スペルが異なる、または現在の表にない列を参照しています。",
"query_editor.sql_error.rule.column_missing.label": "列が存在しません",
"query_editor.sql_error.rule.column_missing.suggestion": "列名、別名、大文字小文字、表別名、および列が現在の FROM/JOIN オブジェクトに属しているか確認してください。",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "元のエラー: {{error}}",
"query_editor.sql_error.wrapper.semantic_line": "意味: {{label}}。{{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "対処案: {{suggestion}}",
+ "query_editor.text_to_sql.description": "クエリまたは処理したいデータを説明してください。GoNavi は現在の接続、データベース、読み込み済みスキーマを使って SQL を生成します。",
+ "query_editor.text_to_sql.generate": "SQL を生成",
+ "query_editor.text_to_sql.mode.insert": "カーソル位置に挿入",
+ "query_editor.text_to_sql.mode.replace_all": "全文を置換",
+ "query_editor.text_to_sql.mode.replace_selection": "選択範囲を置換",
+ "query_editor.text_to_sql.placeholder": "例: 直近 30 日間の日別注文金額を集計し、日付の昇順で返す",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "コミット",
"query_editor.transaction.action.commit_with_count": "コミット ({{count}})",
"query_editor.transaction.action.rollback": "ロールバック",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "接続フィンガープリントを解析できません",
"query_history.backend.message.cleared": "遅いクエリ履歴をクリアしました",
"query_history.backend.message.loaded": "読み込み完了",
- "query.format": "SQL を整形",
- "query.new": "新規クエリ",
- "query.run": "実行",
- "query.save": "クエリを保存",
- "query.stop": "停止",
+ "redis.backend.error.address_required": "Redis 接続アドレスは空にできません",
+ "redis.backend.error.argument_invalid_type": "{{name}} の型が無効です",
+ "redis.backend.error.argument_required": "{{name}} は必須です",
+ "redis.backend.error.cluster_connect_failed": "Redis Cluster への接続に失敗しました: {{detail}}",
+ "redis.backend.error.command_required": "Command は空にできません",
+ "redis.backend.error.connect_attempt_failed": "{{attempt}} 回目の接続に失敗しました: {{detail}}",
+ "redis.backend.error.connect_failed": "Redis への接続に失敗しました: {{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "{{attempt}} 回目の TLS 設定に失敗しました: {{detail}}",
+ "redis.backend.error.export_no_keys": "エクスポート対象の Key がありません",
+ "redis.backend.error.import_no_keys_selected": "インポートする Key が選択されていません",
+ "redis.backend.error.import_payload_invalid": "Redis インポートファイルが無効です: {{detail}}",
+ "redis.backend.error.invalid_node_address": "無効な Redis ノードアドレス: {{address}}",
+ "redis.backend.error.invalid_port": "無効な Redis ポート: {{address}}",
+ "redis.backend.error.node_address_required": "Redis ノードアドレスは空にできません",
+ "redis.backend.error.select_db_index_invalid": "無効なデータベースインデックス: {{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "データベースインデックスは {{min}} から {{max}} の間で指定してください",
+ "redis.backend.error.select_db_index_required": "SELECT コマンドにはデータベースインデックスが必要です",
+ "redis.backend.error.sentinel_connect_failed": "Redis Sentinel への接続に失敗しました: {{detail}}",
+ "redis.backend.error.sentinel_master_required": "Redis Sentinel モードでは master 名が必要です",
+ "redis.backend.error.ssh_tunnel_create_failed": "SSH トンネルの作成に失敗しました: {{detail}}",
+ "redis.backend.error.test_connection_close_failed": "接続には成功しましたが、テスト接続の解放に失敗しました:{{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}} モードはまだ SSH トンネルをサポートしていません。SSH を無効にして再試行してください。",
+ "redis.backend.label.topology_cluster": "クラスター",
+ "redis.backend.label.topology_multi_node": "マルチノード",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "追加しました",
+ "redis.backend.message.connect_success": "接続に成功しました",
+ "redis.backend.message.delete_success": "削除しました",
+ "redis.backend.message.export_success": "エクスポートに成功しました",
+ "redis.backend.message.flush_success": "消去しました",
+ "redis.backend.message.import_success": "インポートに成功しました",
+ "redis.backend.message.rename_success": "名前を変更しました",
+ "redis.backend.message.select_db_success": "データベースを切り替えました",
+ "redis.backend.message.set_success": "設定しました",
+ "redis.db_alias.menu.set": "エイリアスを設定",
+ "redis.db_alias.modal.placeholder": "例: cache、sessions(空欄で解除)",
+ "redis.db_alias.modal.title": "{{db}} のエイリアス",
"redis_command.action.clear_console": "コンソールをクリア",
"redis_command.action.execute": "実行(Cmd+Enter)",
"redis_command.completion.detail": "Redis コマンド",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "末尾へプッシュ",
"redis_viewer.action.add_member": "メンバーを追加",
"redis_viewer.action.add_stream_entry": "エントリを追加",
+ "redis_viewer.action.change_import_file": "インポートファイルを変更",
"redis_viewer.action.clear_group_selection": "選択をクリア",
"redis_viewer.action.clear_selection": "選択をクリア",
"redis_viewer.action.copy": "コピー",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "編集",
"redis_viewer.action.export_all": "すべてエクスポート",
"redis_viewer.action.export_selected": "選択した Key をエクスポート",
- "redis_viewer.action.change_import_file": "インポートファイルを変更",
"redis_viewer.action.import": "インポート",
"redis_viewer.action.load_all": "すべて読み込む",
"redis_viewer.action.load_more": "さらに読み込む",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "更新",
"redis_viewer.action.rename_key": "Key 名を変更",
"redis_viewer.action.select_all_import_keys": "インポート対象をすべて選択",
- "redis_viewer.action.select_import_file": "インポートファイルを選択",
"redis_viewer.action.select_all_loaded": "読み込み済みをすべて選択",
"redis_viewer.action.select_group": "選択",
+ "redis_viewer.action.select_import_file": "インポートファイルを選択",
"redis_viewer.action.set_ttl": "TTL を設定",
"redis_viewer.aria.collapse_group": "グループを折りたたむ",
"redis_viewer.aria.expand_group": "グループを展開",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "バイナリデータは編集できません",
"redis_viewer.hint.switch_auto_to_edit": "編集するには Auto モードに切り替えてください",
"redis_viewer.label.encoding": "エンコーディング: {{encoding}}",
+ "redis_viewer.label.import_database": "元の DB: db{{database}}",
+ "redis_viewer.label.import_selection": "{{selected}} / {{total}} 件の Key を選択中",
"redis_viewer.label.keys_count": "{{count}} 件の Key を読み込み済み",
"redis_viewer.label.length": "長さ: {{count}}",
"redis_viewer.label.node_count": "{{count}} ノード",
- "redis_viewer.label.import_database": "元の DB: db{{database}}",
- "redis_viewer.label.import_selection": "{{selected}} / {{total}} 件の Key を選択中",
"redis_viewer.label.original_key": "元の Key: {{key}}",
"redis_viewer.message.add_failed": "追加に失敗しました: {{detail}}",
"redis_viewer.message.add_success": "追加しました",
@@ -6602,9 +6644,9 @@
"redis_viewer.modal.rename_key": "Key 名を変更",
"redis_viewer.modal.set_ttl": "TTL を設定",
"redis_viewer.modal.update_score": "スコアを更新",
+ "redis_viewer.notice.large_keyspace_mode": "大規模 keyspace パフォーマンスモードが有効です。ノード描画は簡略化され、展開済みグループは最大 {{count}} 件まで保持されます。",
"redis_viewer.option.import_overwrite": "既存 Key を上書き",
"redis_viewer.option.import_skip_existing": "既存 Key をスキップ",
- "redis_viewer.notice.large_keyspace_mode": "大規模 keyspace パフォーマンスモードが有効です。ノード描画は簡略化され、展開済みグループは最大 {{count}} 件まで保持されます。",
"redis_viewer.placeholder.key_name": "Key 名",
"redis_viewer.placeholder.member_value": "メンバー値を入力",
"redis_viewer.placeholder.new_element_value": "新しい要素値を入力",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "生テキスト",
"redis_viewer.view.title": "表示モード",
- "redis.backend.error.address_required": "Redis 接続アドレスは空にできません",
- "redis.backend.error.argument_invalid_type": "{{name}} の型が無効です",
- "redis.backend.error.argument_required": "{{name}} は必須です",
- "redis.backend.error.cluster_connect_failed": "Redis Cluster への接続に失敗しました: {{detail}}",
- "redis.backend.error.command_required": "Command は空にできません",
- "redis.backend.error.connect_attempt_failed": "{{attempt}} 回目の接続に失敗しました: {{detail}}",
- "redis.backend.error.connect_failed": "Redis への接続に失敗しました: {{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "{{attempt}} 回目の TLS 設定に失敗しました: {{detail}}",
- "redis.backend.error.export_no_keys": "エクスポート対象の Key がありません",
- "redis.backend.error.import_no_keys_selected": "インポートする Key が選択されていません",
- "redis.backend.error.import_payload_invalid": "Redis インポートファイルが無効です: {{detail}}",
- "redis.backend.error.invalid_node_address": "無効な Redis ノードアドレス: {{address}}",
- "redis.backend.error.invalid_port": "無効な Redis ポート: {{address}}",
- "redis.backend.error.node_address_required": "Redis ノードアドレスは空にできません",
- "redis.backend.error.select_db_index_invalid": "無効なデータベースインデックス: {{value}}",
- "redis.backend.error.select_db_index_out_of_range": "データベースインデックスは {{min}} から {{max}} の間で指定してください",
- "redis.backend.error.select_db_index_required": "SELECT コマンドにはデータベースインデックスが必要です",
- "redis.backend.error.sentinel_connect_failed": "Redis Sentinel への接続に失敗しました: {{detail}}",
- "redis.backend.error.sentinel_master_required": "Redis Sentinel モードでは master 名が必要です",
- "redis.backend.error.ssh_tunnel_create_failed": "SSH トンネルの作成に失敗しました: {{detail}}",
- "redis.backend.error.test_connection_close_failed": "接続には成功しましたが、テスト接続の解放に失敗しました:{{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}} モードはまだ SSH トンネルをサポートしていません。SSH を無効にして再試行してください。",
- "redis.backend.label.topology_cluster": "クラスター",
- "redis.backend.label.topology_multi_node": "マルチノード",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "追加しました",
- "redis.backend.message.connect_success": "接続に成功しました",
- "redis.backend.message.delete_success": "削除しました",
- "redis.backend.message.export_success": "エクスポートに成功しました",
- "redis.backend.message.flush_success": "消去しました",
- "redis.backend.message.import_success": "インポートに成功しました",
- "redis.backend.message.rename_success": "名前を変更しました",
- "redis.backend.message.select_db_success": "データベースを切り替えました",
- "redis.backend.message.set_success": "設定しました",
- "redis.db_alias.menu.set": "エイリアスを設定",
- "redis.db_alias.modal.placeholder": "例: cache、sessions(空欄で解除)",
- "redis.db_alias.modal.title": "{{db}} のエイリアス",
"saved_query.default_name": "クエリ {{index}}",
"saved_query.error.missing_context": "保存済みクエリに SQL、接続、またはデータベースのコンテキストがありません",
"security_update.action.open_ai_settings": "AI 設定",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "テーブル {{table}} をもとに、よく使う SQL クエリを 3 件生成してください。",
"sidebar.aria.switch_connection": "接続 {{name}} に切り替え",
"sidebar.badge.recommended": "推奨",
- "sidebar.batch_databases": "一括データベース",
- "sidebar.batch_tables": "一括テーブル",
"sidebar.batch.filtered_count": "{{filtered}} / {{total}} 件のオブジェクトを表示",
"sidebar.batch.group.tables": "テーブル",
"sidebar.batch.group.views": "ビュー",
"sidebar.batch.no_matching_objects": "一致するオブジェクトはありません",
"sidebar.batch.selected_databases": "{{selected}} / {{total}} 件のデータベースを選択中",
"sidebar.batch.selected_objects": "{{selected}} / {{total}} 件のオブジェクトを選択中",
+ "sidebar.batch_databases": "一括データベース",
+ "sidebar.batch_tables": "一括テーブル",
"sidebar.command_search.action.ask_ai.title": "AI に質問",
"sidebar.command_search.action.new_connection.meta": "データベース、ランタイム、またはその他のデータソース接続を作成",
"sidebar.command_search.action.new_connection.title": "新規データソース",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "テーブル名",
"sidebar.copy_object_name.label.view": "ビュー名",
"sidebar.error.unknown": "不明なエラー",
+ "sidebar.external_sql.directory_fallback": "SQL ディレクトリ",
+ "sidebar.external_sql.root": "外部 SQL ファイル",
"sidebar.external_sql_modal.action.create": "作成",
"sidebar.external_sql_modal.action.rename": "名前を変更",
"sidebar.external_sql_modal.field.directory_name": "ディレクトリ名",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "ディレクトリ名を入力してください",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "ファイル名にパス区切り文字を含めることはできません",
"sidebar.external_sql_modal.validation.sql_file_name_required": "SQL ファイル名を入力してください",
- "sidebar.external_sql.directory_fallback": "SQL ディレクトリ",
- "sidebar.external_sql.root": "外部 SQL ファイル",
"sidebar.field.database_name": "データベース名",
"sidebar.field.new_database_name": "新しいデータベース名",
"sidebar.field.new_table_name": "新しいテーブル名",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "データベースを 1 件以上選択してください。",
"sidebar.message.select_host_before_large_sql_file": "大きな SQL ファイルを実行する前に Host を選択してください。",
"sidebar.message.select_object_required": "オブジェクトを 1 件以上選択してください。",
- "sidebar.message.select_table_required": "テーブルを 1 件以上選択してください。",
"sidebar.message.select_sql_directory_failed": "SQL ディレクトリの選択に失敗しました: {{error}}",
+ "sidebar.message.select_table_required": "テーブルを 1 件以上選択してください。",
"sidebar.message.sidebar_filter_reset": "サイドバーフィルターをリセットしました。",
"sidebar.message.sidebar_filter_sync_disabled": "左側フィルターの同期を無効にしました。",
"sidebar.message.sidebar_filter_sync_enabled": "左側フィルターの同期を有効にしました。",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "オブジェクト一括操作",
"sidebar.modal.confirm_clear_selected_tables.content": "{{connection}} / {{database}} の選択したオブジェクトのデータをクリアしますか?この操作は元に戻せません。",
"sidebar.modal.confirm_clear_selected_tables.title": "選択したテーブルのクリアを確認",
- "sidebar.modal.confirm_delete_selected_databases.content": "{{connection}} 配下の選択した {{count}} 件のデータベースを削除しますか?この操作は元に戻せません。",
- "sidebar.modal.confirm_delete_selected_databases.title": "選択したデータベースの削除を確認",
- "sidebar.modal.confirm_delete_selected_tables.content": "{{connection}} / {{database}} 配下の選択した {{count}} 件のテーブルを削除しますか?この操作は元に戻せません。",
- "sidebar.modal.confirm_delete_selected_tables.title": "選択したテーブルの削除を確認",
+ "sidebar.modal.confirm_delete.title": "削除の確認",
"sidebar.modal.confirm_delete_connection.content": "接続 {{name}} を削除しますか?",
"sidebar.modal.confirm_delete_database.content": "{{name}} を削除しますか?この操作は元に戻せません。",
"sidebar.modal.confirm_delete_database.title": "データベースを削除",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "保存済みクエリ「{{name}}」を削除しますか?この操作は元に戻せません。",
"sidebar.modal.confirm_delete_schema.content": "schema {{name}} を削除しますか?schema とその中のすべてのオブジェクトが削除されます。この操作は元に戻せません。",
"sidebar.modal.confirm_delete_schema.title": "schema を削除",
+ "sidebar.modal.confirm_delete_selected_databases.content": "{{connection}} 配下の選択した {{count}} 件のデータベースを削除しますか?この操作は元に戻せません。",
+ "sidebar.modal.confirm_delete_selected_databases.title": "選択したデータベースの削除を確認",
+ "sidebar.modal.confirm_delete_selected_tables.content": "{{connection}} / {{database}} 配下の選択した {{count}} 件のテーブルを削除しますか?この操作は元に戻せません。",
+ "sidebar.modal.confirm_delete_selected_tables.title": "選択したテーブルの削除を確認",
"sidebar.modal.confirm_delete_sql_directory.content": "\"{{name}}\" を削除しますか?この操作はローカルディスク上のディレクトリを削除し、空のディレクトリのみ削除できます。",
"sidebar.modal.confirm_delete_sql_directory.title": "SQL ディレクトリを削除",
"sidebar.modal.confirm_delete_sql_file.content": "\"{{name}}\" を削除しますか?この操作はローカルディスク上のファイルを削除し、元に戻せません。",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "グループ「{{name}}」を削除しますか?中の接続は削除されません。",
"sidebar.modal.confirm_delete_view.content": "{{name}} を削除しますか?この操作は元に戻せません。",
"sidebar.modal.confirm_delete_view.title": "ビューを削除",
- "sidebar.modal.confirm_delete.title": "削除の確認",
"sidebar.modal.confirm_table_data_action.content": "{{action}} {{table}} を実行しますか?この操作は元に戻せません。",
"sidebar.modal.confirm_table_data_action.title": "{{action}} の確認",
"sidebar.modal.create_database.title": "データベースを作成",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "グループを作成",
"sidebar.modal.tag.edit_description": "グループ名と含める接続を更新します。",
"sidebar.modal.tag.edit_title": "グループを編集",
+ "sidebar.object.function": "関数",
+ "sidebar.object.procedure": "プロシージャ",
+ "sidebar.object.view": "ビュー",
"sidebar.object_group.events": "イベント",
"sidebar.object_group.materialized_views": "マテリアライズドビュー",
"sidebar.object_group.packages": "パッケージ",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "テーブル",
"sidebar.object_group.triggers": "トリガー",
"sidebar.object_group.views": "ビュー",
- "sidebar.object.function": "関数",
- "sidebar.object.procedure": "プロシージャ",
- "sidebar.object.view": "ビュー",
"sidebar.placeholder.filter_table_view": "テーブルまたはビューを絞り込み",
"sidebar.placeholder.select_connection": "接続を選択",
"sidebar.placeholder.select_connection_first": "先に接続を選択してください",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "手動範囲",
"sidebar.search.multi_select_supported": "複数選択に対応",
"sidebar.search.placeholder": "検索...",
- "sidebar.search.scope_description": "サイドバー検索の対象範囲を選択します。",
- "sidebar.search.scope_hint": "スマートモードでは、コンテキストに応じて名前、ホスト、データベース、オブジェクトを検索します。",
- "sidebar.search.scope_title": "検索範囲",
- "sidebar.search.scope_tooltip": "現在の検索範囲: {{scope}}",
"sidebar.search.scope.database": "データベース",
"sidebar.search.scope.host": "ホスト",
"sidebar.search.scope.object": "オブジェクト",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "選択中のノードに応じて検索範囲を自動的に絞り込みます。",
"sidebar.search.scope.smart_short": "スマート",
"sidebar.search.scope.tag": "タグ",
+ "sidebar.search.scope_description": "サイドバー検索の対象範囲を選択します。",
+ "sidebar.search.scope_hint": "スマートモードでは、コンテキストに応じて名前、ホスト、データベース、オブジェクトを検索します。",
+ "sidebar.search.scope_title": "検索範囲",
+ "sidebar.search.scope_tooltip": "現在の検索範囲: {{scope}}",
"sidebar.sql_directory.default_name": "SQL ディレクトリ",
+ "sidebar.sql_file.default_name": "SQL ファイル",
"sidebar.sql_file_exec.cancel": "実行をキャンセル",
"sidebar.sql_file_exec.executed_label": "実行済み: ",
"sidebar.sql_file_exec.file_size": "ファイルサイズ: ",
+ "sidebar.sql_file_exec.message.already_running": "外部 SQL の実行タスクはすでに実行中です",
"sidebar.sql_file_exec.rows_separator": " 行 | 失敗: ",
"sidebar.sql_file_exec.rows_suffix": " 行",
- "sidebar.sql_file_exec.status_label": "ステータス: ",
"sidebar.sql_file_exec.status.cancelled": "キャンセル済み",
"sidebar.sql_file_exec.status.done": "完了",
"sidebar.sql_file_exec.status.error": "エラー",
"sidebar.sql_file_exec.status.running": "実行中",
+ "sidebar.sql_file_exec.status_label": "ステータス: ",
"sidebar.sql_file_exec.title": "外部 SQL ファイルを実行",
- "sidebar.sql_file_exec.message.already_running": "外部 SQL の実行タスクはすでに実行中です",
"sidebar.sql_file_exec.workbench.action.clear_history": "履歴をクリア",
"sidebar.sql_file_exec.workbench.action.run_again": "再実行",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "まだ実行中のタスクはありません。ファイルを選択すると、進捗がここに表示され続けます。",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "開始時刻",
"sidebar.sql_file_exec.workbench.section.config": "実行設定",
"sidebar.sql_file_exec.workbench.stage.preparing": "実行を準備中",
- "sidebar.sql_file.default_name": "SQL ファイル",
"sidebar.sql_template.duckdb_macro_hint": "関数のような動作には SQL Macro を使用してください",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB はまだストアドプロシージャをサポートしていません",
"sidebar.sql_template.edit_routine": "{{type}} {{name}} を編集",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "現在のスキーマのテーブル構造をエクスポート · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · スキーマ操作",
"sidebar.v2_table_group_menu.current_database": "現在のデータベース",
- "sidebar.v2_table_group_menu.display_section": "表示",
"sidebar.v2_table_group_menu.display_create_time": "作成時刻を表示",
+ "sidebar.v2_table_group_menu.display_section": "表示",
"sidebar.v2_table_group_menu.display_table_rows": "行数を表示",
"sidebar.v2_table_group_menu.display_table_size": "テーブルサイズを表示",
"sidebar.v2_table_group_menu.display_update_time": "更新時刻を表示",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "診断は SELECT / WITH クエリのみサポートします。更新系は EXPLAIN PLAN モードを使用してください(PR2 対応)。",
"sql_analysis.backend.error.unsupported_db_type": "現在のデータソース({{dbType}})はまだ SQL 診断をサポートしていません。第1期では MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase をサポートします。",
"sql_analysis.backend.message.completed": "診断が完了しました",
- "sql_analysis.explain_graph.flag.filesort": "追加ソート",
- "sql_analysis.explain_graph.flag.full_scan": "フルスキャン",
- "sql_analysis.explain_graph.flag.temp_table": "一時テーブル",
- "sql_analysis.explain_graph.label.index": "インデックス: ",
- "sql_analysis.explain_graph.label.table": "テーブル: ",
- "sql_analysis.explain_graph.metric.actual_rows": "実測",
- "sql_analysis.explain_graph.metric.cost": "コスト",
- "sql_analysis.explain_graph.metric.est_rows": "推定",
"sql_analysis.explain.empty": "SQL を入力して診断を実行してください",
"sql_analysis.explain.error.query_required": "クエリが空です",
"sql_analysis.explain.error.run_failed": "診断に失敗しました",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(原文なし)",
"sql_analysis.explain.view.plan": "実行計画",
"sql_analysis.explain.view.raw": "原文",
+ "sql_analysis.explain_graph.flag.filesort": "追加ソート",
+ "sql_analysis.explain_graph.flag.full_scan": "フルスキャン",
+ "sql_analysis.explain_graph.flag.temp_table": "一時テーブル",
+ "sql_analysis.explain_graph.label.index": "インデックス: ",
+ "sql_analysis.explain_graph.label.table": "テーブル: ",
+ "sql_analysis.explain_graph.metric.actual_rows": "実測",
+ "sql_analysis.explain_graph.metric.cost": "コスト",
+ "sql_analysis.explain_graph.metric.est_rows": "推定",
"sql_analysis.sidebar.node.actual_rows": "実測行数",
"sql_analysis.sidebar.node.buffer_hit": "バッファヒット",
"sql_analysis.sidebar.node.cost": "コスト",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "タグ {{index}}",
"store.fallback.sql_snippet_name": "スニペット {{index}}",
"tab_manager.close_aria": "{{title}} を閉じる",
+ "tab_manager.detached.close": "ウィンドウを閉じる",
+ "tab_manager.detached.restore": "タブに戻す",
+ "tab_manager.detached.title_fallback": "フローティングウィンドウ",
"tab_manager.empty.action.open_ai": "AI を開く",
"tab_manager.empty.aria.start_workbench": "GoNavi 開始ワークベンチ",
"tab_manager.empty.eyebrow.connections": "{{count}} 件の接続",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "左側のタブを閉じる",
"tab_manager.menu.close_other": "他のタブを閉じる",
"tab_manager.menu.close_right": "右側のタブを閉じる",
+ "tab_manager.menu.open_in_window": "フローティングウィンドウで開く",
+ "tab_manager.menu.restore_to_tab": "タブに戻す",
"tab_manager.menu.tab_display_settings": "タブ設定",
"tab_manager.sql_file_close.close_tabs": "タブを閉じる",
"tab_manager.sql_file_close.continue_close": "閉じる処理を続行",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "初期化情報の有効期限が切れました。ページを再読み込みして再試行してください。",
"web_auth.error.setup_required": "先に Web 認証の初期設定が必要です",
"web_auth.error.setup_token_expired": "初期化トークンの有効期限が切れました。ページを再読み込みして再試行してください。",
- "web_auth.error.totp_code_required": "Google Authenticator のコードまたはリカバリーコードを入力してください",
"web_auth.error.too_many_login_attempts": "サインイン失敗が多すぎます。しばらくしてから再試行してください。",
+ "web_auth.error.totp_code_required": "Google Authenticator のコードまたはリカバリーコードを入力してください",
"web_auth.page.login.code_label": "Google Authenticator コード / リカバリーコード",
"web_auth.page.login.code_placeholder": "6 桁コードまたはリカバリーコード",
"web_auth.page.login.description": "ブラウザー版はサーバー側セッションを使用します。アイドルタイムアウト、絶対タイムアウト、ログイン保持期間はサーバーで一元管理されます。",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "リカバリーコードは今回のみ表示されます。オフラインで保存してください:",
"web_auth.page.setup.remember_label": "ログインを記憶(日)",
"web_auth.page.setup.secret_label": "Secret",
+ "web_auth.page.setup.session_title": "セッションポリシー",
"web_auth.page.setup.step_admin_description": "最初にブラウザー管理用の認証情報を作成",
"web_auth.page.setup.step_admin_hint": "まず管理者パスワードを設定し、Google Authenticator 2FA をすぐ有効にするか決めます。",
"web_auth.page.setup.step_admin_title": "管理者パスワードを作成",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "QR コードまたは手入力で TOTP を登録",
"web_auth.page.setup.step_totp_hint": "2FA を有効にする場合は、ここで認証アプリを登録し、最初のコードで設定を確認してください。",
"web_auth.page.setup.step_totp_title": "認証アプリを登録",
- "web_auth.page.setup.session_title": "セッションポリシー",
"web_auth.page.setup.submit": "初期設定を完了して GoNavi を開く",
"web_auth.page.setup.subtitle": "初回起動時に管理者パスワードを作成し、Google Authenticator をすぐに関連付けます",
"web_auth.page.setup.title": "GoNavi Web を初期化",
diff --git a/shared/i18n/ru-RU.json b/shared/i18n/ru-RU.json
index 2e4ce8a9..4842f18a 100644
--- a/shared/i18n/ru-RU.json
+++ b/shared/i18n/ru-RU.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "Не удалось создать каталог конфигурации Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Неверный формат конфигурации Claude Code: {{path}} должен быть {{expected}}",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "Не удалось разобрать конфигурацию Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "Не удалось найти конфигурацию Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "Не удалось прочитать конфигурацию Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "Не удалось сериализовать конфигурацию Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "Не удалось записать конфигурацию Claude Code: {{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "Пользовательская конфигурация MCP для Claude Code записана. Перезапустите Claude CLI, после чего GoNavi появится в User MCPs в /mcp.",
+ "ai.service.mcp_client.claude_code.status.connected": "Пользовательская конфигурация GoNavi MCP для Claude Code обнаружена и совпадает с текущим путем установки GoNavi",
+ "ai.service.mcp_client.claude_code.status.missing": "Пользовательская конфигурация GoNavi MCP для Claude Code не обнаружена",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "В Claude Code обнаружена запись GoNavi MCP, но проверка текущего пути установки GoNavi не удалась: {{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "В Claude Code обнаружена запись GoNavi MCP, но она не совпадает с текущим путем установки GoNavi. Рекомендуется обновить.",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "Не удалось создать каталог конфигурации Codex: {{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Неверный формат конфигурации Codex: {{path}} не удалось разобрать как {{expected}}",
+ "ai.service.mcp_client.codex.config_path_failed": "Не удалось найти конфигурацию Codex: {{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "Не удалось прочитать конфигурацию Codex: {{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "Не удалось записать конфигурацию Codex: {{detail}}",
+ "ai.service.mcp_client.codex.install_success": "Пользовательская конфигурация MCP для Codex записана. Перезапустите Codex CLI или настольное приложение, чтобы увидеть GoNavi.",
+ "ai.service.mcp_client.codex.status.connected": "Пользовательская конфигурация GoNavi MCP для Codex обнаружена и совпадает с текущим путем установки GoNavi",
+ "ai.service.mcp_client.codex.status.missing": "Пользовательская конфигурация GoNavi MCP для Codex не обнаружена",
+ "ai.service.mcp_client.codex.status.path_check_failed": "В Codex обнаружена запись GoNavi MCP, но проверка текущего пути установки GoNavi не удалась: {{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "В Codex обнаружена запись GoNavi MCP, но она не совпадает с текущим путем установки GoNavi. Рекомендуется обновить.",
+ "ai.service.mcp_client.executable_path_empty": "Путь к текущему исполняемому файлу GoNavi пуст",
+ "ai.service.mcp_client.executable_path_failed": "Не удалось найти текущий исполняемый файл GoNavi: {{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} обычно работает в облаке или удаленной среде. Подключите его к Windows GoNavi через удаленный MCP-мост; пароли баз данных остаются на этой машине GoNavi.",
+ "ai.service.mcp_client.user_home_dir_unavailable": "Не удалось определить домашний каталог текущего пользователя",
"ai_chat.builtin_tools.database.execute_sql.desc": "Execute a SQL query and return results",
"ai_chat.builtin_tools.database.execute_sql.detail": "Pass connectionId, dbName, and sql, then execute SQL on the target database and return results (up to 50 rows). Controlled by safety level; read-only mode only allows SELECT/SHOW/DESCRIBE.",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "Connection ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "Новый чат",
"ai_chat.header.export_time": "Время экспорта:",
"ai_chat.header.export_user": "Вы",
- "ai_chat.header.mode_tabs.aria_label": "Режим работы AI",
"ai_chat.header.mode.chat": "Чат",
"ai_chat.header.mode.history": "История",
"ai_chat.header.mode.insights": "Автоинсайты",
+ "ai_chat.header.mode_tabs.aria_label": "Режим работы AI",
"ai_chat.header.session.connected": "{{title}} · Подключено",
"ai_chat.header.tooltip.close": "Закрыть панель",
"ai_chat.header.tooltip.export_markdown": "Экспортировать как Markdown",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "Сопоставьте messageId и contentPreview с текущим диалогом, чтобы определить, какой пузырь вызвал ошибку рендеринга.",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "Если нужно сузить область дальше, сравните последний ввод пользователя, результаты инструментов и связанный код компонентов.",
"ai_chat.inspection.last_render_error.recorded_summary": "Зафиксирована недавняя ошибка рендеринга сообщения AI, включая сообщение, путь рендеринга и сводку стека для диагностики.",
+ "ai_chat.inspection.mcp.message.configured": "Настроено MCP-серверов: {{serverCount}}; включено: {{enabledCount}}",
+ "ai_chat.inspection.mcp.message.empty": "MCP-серверы еще не настроены",
+ "ai_chat.inspection.mcp.message.with_issues": "Настроено MCP-серверов: {{serverCount}}; включено: {{enabledCount}}; требуют внимания проверки конфигурации: {{issueCount}}",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "Сначала исправьте ошибки конфигурации MCP-сервера, затем повторно протестируйте сервер",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Откройте затронутый MCP-сервер и разделите команду запуска, аргументы и тайм-аут согласно подсказкам проверки конфигурации",
+ "ai_chat.inspection.mcp.warning.config_errors": "У {{count}} MCP-сервера есть ошибки конфигурации запуска; тестирование и обнаружение инструментов могут завершиться неудачно",
+ "ai_chat.inspection.mcp.warning.config_warnings": "У {{count}} MCP-сервера есть предупреждения конфигурации запуска; проверьте их перед диагностикой сбоев обнаружения инструментов",
"ai_chat.inspection.mcp_docker.message.empty": "Docker MCP-серверы сейчас не настроены",
"ai_chat.inspection.mcp_docker.message.with_enabled": "Сейчас Docker MCP-серверов: {{total}}; включено: {{enabled}}",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "Сейчас Docker MCP-серверов: {{total}}; у {{count}} ключевые аргументы неполные",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "Некоторые MCP-инструменты не объявляют inputSchema, поэтому описание параметров может быть неполным.",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "Подходящий MCP-инструмент не найден.",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "MCP-инструменты не обнаружены; возможно, MCP-сервисы не настроены или тест/обнаружение сервиса завершились ошибкой.",
- "ai_chat.inspection.mcp.message.configured": "Настроено MCP-серверов: {{serverCount}}; включено: {{enabledCount}}",
- "ai_chat.inspection.mcp.message.empty": "MCP-серверы еще не настроены",
- "ai_chat.inspection.mcp.message.with_issues": "Настроено MCP-серверов: {{serverCount}}; включено: {{enabledCount}}; требуют внимания проверки конфигурации: {{issueCount}}",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "Сначала исправьте ошибки конфигурации MCP-сервера, затем повторно протестируйте сервер",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "Откройте затронутый MCP-сервер и разделите команду запуска, аргументы и тайм-аут согласно подсказкам проверки конфигурации",
- "ai_chat.inspection.mcp.warning.config_errors": "У {{count}} MCP-сервера есть ошибки конфигурации запуска; тестирование и обнаружение инструментов могут завершиться неудачно",
- "ai_chat.inspection.mcp.warning.config_warnings": "У {{count}} MCP-сервера есть предупреждения конфигурации запуска; проверьте их перед диагностикой сбоев обнаружения инструментов",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "Проверьте, не оставили ли пути ошибки или отмены пустые сообщения-заполнители assistant.",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "Проверьте, переиспользует ли логика потокового добавления тот же assistantMsgId, а не создает новое сообщение assistant для того же ответа.",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "Сначала проверьте, записывает ли useAIChatLocalTools сообщение tool для каждого tool_call_id.",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "Returns whether the current chat input has all prerequisites to send, including active provider, missing key or endpoint on the current provider, selected model, current connection context, attached table context, and next actions. Use it when users ask why sending is disabled or what the chat input is missing.",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "No parameters",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "Read the send-prerequisite state of the current AI chat input, including active provider, key and endpoint completeness, selected model, current connection context, attached table schema count, and suggested next actions.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "Диагностировать размер AI-контекста и риск стабильности",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "Оценивает последние сообщения, результаты инструментов, прикрепленные table DDL, MCP tool schemas, пользовательские prompts и Skills в текущей или указанной AI-сессии, затем возвращает риск low/medium/high/critical, главные источники роста и предложения по сужению.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "Необязательно. Возвращать ли детали largest message, largest DDL table и largest MCP schema. По умолчанию true.",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "Необязательно. AI session ID для диагностики. Если не указан, используется текущая активная сессия.",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(по умолчанию текущая сессия), messageLimit?(по умолчанию 40), includeDetails?(по умолчанию true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "Читает снимок размера AI-контекста и риска стабильности, включая окно последних сообщений, длину результатов инструментов, прикрепленный table DDL, MCP tool schemas, пользовательские prompts и включенные Skills.",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "Inspect currently attached AI table-schema context",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "Returns the tables currently attached to the AI conversation context, their connection and database, and optional DDL previews. Use it when users ask which table structures are attached or what the current AI context contains.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "Optional. DDL truncation length. Default 4000, maximum 12000.",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "Optional. Whether to include each table's DDL content. Default false.",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(default false), ddlLimit?(default 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "Read the table-schema snapshot currently attached to the AI conversation context, including connection, database, table name, and optional DDL content.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "Inspect current AI prompts and Skills configuration",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "Returns current user-defined global, database, and JVM prompts, plus enabled Skills, scopes, dependency tools, and skill prompt content. Use it when users ask which prompts are currently attached, why AI answers this way, or which Skills are active.",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "No parameters",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "Состояние подключения внешнего инструмента: не подключено",
"ai_chat.mcp_client.install.state.remote": "Состояние подключения внешнего инструмента: нужен удаленный MCP-мост",
"ai_chat.mcp_client.install.state.stale": "Состояние подключения внешнего инструмента: найдена старая конфигурация, нужно обновление",
- "ai_chat.mcp_client.install.status_tone.connected": "Подключено",
- "ai_chat.mcp_client.install.status_tone.not_connected": "Не подключено",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "Удаленный мост",
- "ai_chat.mcp_client.install.status_tone.status_error": "Ошибка статуса",
- "ai_chat.mcp_client.install.status_tone.update_required": "Нужно обновить",
- "ai_chat.mcp_client.install.status.cli_prefix": "Проверка CLI: {{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "Обнаружено {{command}}",
"ai_chat.mcp_client.install.status.cli.not_detected": "{{command}} не обнаружено; конфигурацию все равно можно записать сначала",
"ai_chat.mcp_client.install.status.cli.remote": "Удаленному Agent не нужна локальная проверка команды {{command}}",
+ "ai_chat.mcp_client.install.status.cli_prefix": "Проверка CLI: {{status}}",
"ai_chat.mcp_client.install.status.command_path": "Путь команды: {{path}}",
"ai_chat.mcp_client.install.status.config_file": "Файл конфигурации: {{path}}",
"ai_chat.mcp_client.install.status.copy_command": "Скопировать команду запуска",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "Обновить статус",
"ai_chat.mcp_client.install.status.remote_boundary": "Граница удаленного подключения: данные подключения и пароли базы данных остаются в Windows GoNavi. Облачные Agents по умолчанию читают сводки подключений, списки объектов, таблицы, views и DDL через MCP-инструменты schema-only, а execute_sql не регистрируется. Для доступа между машинами используйте режим GoNavi Streamable HTTP с token, туннелем или обратным прокси.",
"ai_chat.mcp_client.install.status.title": "Статус выбранного клиента",
+ "ai_chat.mcp_client.install.status_tone.connected": "Подключено",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "Не подключено",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "Удаленный мост",
+ "ai_chat.mcp_client.install.status_tone.status_error": "Ошибка статуса",
+ "ai_chat.mcp_client.install.status_tone.update_required": "Нужно обновить",
"ai_chat.mcp_client.install.summary.connected": "{{label}} подключен к этому GoNavi MCP и может вызывать его напрямую.",
"ai_chat.mcp_client.install.summary.error": "Не удалось прочитать состояние подключения для {{label}}. Сначала обновите проверку.",
"ai_chat.mcp_client.install.summary.missing": "Этот GoNavi MCP еще не подключен к {{label}}.",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "Прочитать список объектов базы данных",
"ai_chat.message.tool_call.get_table_ddl": "Извлечь выражение CREATE TABLE",
"ai_chat.message.tool_call.get_tables": "Анализировать сведения о структуре таблиц",
- "ai_chat.message.tool_call.get_views": "Анализировать сведения о структуре views",
"ai_chat.message.tool_call.get_triggers": "Проверить логику триггеров",
+ "ai_chat.message.tool_call.get_views": "Анализировать сведения о структуре views",
"ai_chat.message.tool_call.inspect_active_tab": "Прочитать текущую активную вкладку",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "Прочитать состояние готовности AI-чата к отправке",
"ai_chat.message.tool_call.inspect_ai_context_budget": "Диагностировать риск объема контекста AI",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "разрешено",
"ai_chat.system.context.permission.denied": "запрещено",
"ai_chat.system.context.skill_prompt": "В этом ответе активен Skill \"{{skillName}}\" ({{skillDescription}}). Соблюдай его ограничения и рабочий процесс:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "В этом ответе активен Skill \"{{skillName}}\". Соблюдай его ограничения и рабочий процесс:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\nЗависимые tools: {{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "В этом ответе активен Skill \"{{skillName}}\". Соблюдай его ограничения и рабочий процесс:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "Если пользователь спрашивает, почему отправка недоступна, чего не хватает текущему AI chat или готова ли область ввода, сначала вызови inspect_ai_chat_readiness и прочитай реальное состояние перед отправкой.",
"ai_chat.system.inspection_guidance.inspect_ai_context": "Если пользователь спрашивает про текущий AI context, связанные таблицы или схемы таблиц в сессии, сначала вызови inspect_ai_context и прочитай подключенный контекст схем.",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "Если пользователь упоминает slow AI, oversized context, слишком много table schemas, длинные tool results, нестабильные ответы или нужен sizing context перед сложной задачей, сначала вызови inspect_ai_context_budget и прочитай size risks.",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "Введите корректный URL конечной точки",
"ai_settings.form.api_format": "Формат API",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "Оставьте пустым, чтобы использовать уже выполненный на этом компьютере вход в CodeBuddy CLI; если заполнить, приоритет будет у текущих учётных данных.",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (необязательно)",
"ai_settings.form.api_key_keep_placeholder": "Оставьте пустым, чтобы продолжить использовать сохраненный секрет",
"ai_settings.form.api_key_placeholder": "sk-... / ваш API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "Оставьте пустым для локальной сессии входа или введите API Key / Token для переопределения",
"ai_settings.form.api_key_required": "Введите API Key",
"ai_settings.form.api_key_saved_hint": "API Key уже сохранен. Оставьте поле пустым, чтобы использовать его дальше, или введите новое значение для замены.",
- "ai_settings.form.api_key.codebuddy_hint": "Оставьте пустым, чтобы использовать уже выполненный на этом компьютере вход в CodeBuddy CLI; если заполнить, приоритет будет у текущих учётных данных.",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token (необязательно)",
"ai_settings.form.clear_saved_api_key": "Очистить сохраненный API Key",
+ "ai_settings.form.inline_completion_model": "Модель автодополнения",
+ "ai_settings.form.inline_completion_model_hint": "Выберите более маленькую и быструю модель для серых подсказок SQL-редактора. Оставьте пустым, чтобы использовать модель чата.",
+ "ai_settings.form.inline_completion_model_placeholder": "Использовать модель чата",
"ai_settings.form.model_list": "Список доступных моделей (необязательно)",
"ai_settings.form.model_list_placeholder": "Укажите ID моделей; оставьте пустым, чтобы получить их с сервера",
"ai_settings.form.model_list_placeholder.codebuddy": "Необязательно: заранее укажите частые модели; если оставить пустым, CodeBuddy CLI или сервис выберет автоматически",
"ai_settings.form.model_list_placeholder.cursor": "Необязательно: заранее укажите частые ID моделей Cursor; если оставить пустым, автоматически будет выбрана модель Cursor по умолчанию",
- "ai_settings.form.inline_completion_model": "Модель автодополнения",
- "ai_settings.form.inline_completion_model_hint": "Выберите более маленькую и быструю модель для серых подсказок SQL-редактора. Оставьте пустым, чтобы использовать модель чата.",
- "ai_settings.form.inline_completion_model_placeholder": "Использовать модель чата",
"ai_settings.form.provider_name": "Имя поставщика",
"ai_settings.form.provider_name_placeholder": "Пример: собственная OpenAI-совместимая конечная точка / частная модель",
"ai_settings.form.provider_name_required": "Введите имя",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "Служба GoNavi MCP HTTP не запущена",
"ai_settings.mcp_server.argument_hints.action_separator": "; ",
"ai_settings.mcp_server.argument_hints.argument_details": "Пояснения по аргументам",
- "ai_settings.mcp_server.argument_hints.business_arguments": "Обнаруженные бизнес-аргументы",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "Передавайте данные аутентификации только если README требует аргумент команды; предпочитайте переменные окружения.",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "Токен доступа",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "Введите реальное значение локально; не вставляйте его в чат или скриншоты.",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "Задает адрес сервиса или точку входа API, нужную MCP-сервису.",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "Базовый URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "Введите полный адрес и не встраивайте секреты в URL.",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Указывает локальный файл, каталог, репозиторий или исполняемый файл для MCP-сервиса.",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "Файл конфигурации",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Используйте абсолютный локальный путь и минимально необходимую область доступа.",
"ai_settings.mcp_server.argument_hints.business.config.detail": "Указывает локальный файл, каталог, репозиторий или исполняемый файл для MCP-сервиса.",
"ai_settings.mcp_server.argument_hints.business.config.label": "Файл конфигурации",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "Используйте абсолютный локальный путь и минимально необходимую область доступа.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "Указывает локальный файл, каталог, репозиторий или исполняемый файл для MCP-сервиса.",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "Файл конфигурации",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "Используйте абсолютный локальный путь и минимально необходимую область доступа.",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "Указывает локальный файл, каталог, репозиторий или исполняемый файл для MCP-сервиса.",
"ai_settings.mcp_server.argument_hints.business.dir.label": "Каталог",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "Используйте абсолютный локальный путь и минимально необходимую область доступа.",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "Указывает локальный файл, каталог, репозиторий или исполняемый файл для MCP-сервиса.",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "Каталог рабочей области",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "Используйте абсолютный локальный путь и минимально необходимую область доступа.",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "Обнаруженные бизнес-аргументы",
"ai_settings.mcp_server.argument_hints.category.endpoint": "Адрес",
"ai_settings.mcp_server.argument_hints.category.generic": "Бизнес",
"ai_settings.mcp_server.argument_hints.category.mode": "Режим",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "Обнаружено переменных: {{envVarCount}}; {{secretLikeCount}} похожи на секреты. Здесь объясняются только назначение и риск key; value не показывается.",
"ai_settings.mcp_server.env_hints.title": "Подсказки по назначению переменных окружения",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "Указать: ",
- "ai_settings.mcp_server.env_hints.warning_prefix": "Внимание: {{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "При command=docker эти переменные окружения передаются только в docker CLI и не попадают в контейнер автоматически.",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} значений переменных окружения пустые; заполните или удалите их перед тестированием.",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} переменных окружения всё ещё похожи на пример-заполнитель.",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "Внимание: {{warnings}}",
"ai_settings.mcp_server.form.action.delete": "Удалить",
"ai_settings.mcp_server.form.action.delete_cancel": "Отмена",
"ai_settings.mcp_server.form.action.delete_confirm": "Удалить этот MCP-сервис?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "Отключено",
"ai_settings.mcp_server.form.enabled.option.enabled": "Включено",
"ai_settings.mcp_server.form.enabled.title": "Состояние включения",
- "ai_settings.mcp_server.form.env_status.empty": "Каждая строка должна быть KEY=VALUE; строки без знака равенства или с пробелами в key не сохраняются.",
- "ai_settings.mcp_server.form.env_status.invalid": "Обнаружено переменных окружения: {{validCount}}; также {{invalidCount}} недопустимых строк не будут сохранены сейчас: {{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "Обнаружено переменных окружения: {{count}}.",
"ai_settings.mcp_server.form.env.description": "Одна строка KEY=VALUE на переменную, обычно для API Key, рабочей директории, адреса сервиса и похожих настроек. Если не нужно, оставьте пустым. Эти значения сохраняются в локальной конфигурации и передаются как переменные окружения при запуске MCP-процесса; не пишите export и не помещайте секреты в чат.",
"ai_settings.mcp_server.form.env.placeholder": "Переменные окружения, одна строка KEY=VALUE на переменную, например:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "Переменные окружения",
+ "ai_settings.mcp_server.form.env_status.empty": "Каждая строка должна быть KEY=VALUE; строки без знака равенства или с пробелами в key не сохраняются.",
+ "ai_settings.mcp_server.form.env_status.invalid": "Обнаружено переменных окружения: {{validCount}}; также {{invalidCount}} недопустимых строк не будут сохранены сейчас: {{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "Обнаружено переменных окружения: {{count}}.",
"ai_settings.mcp_server.form.instructions.save_description": "записывает этот MCP в локальную конфигурацию для долгосрочного использования.",
"ai_settings.mcp_server.form.instructions.save_title": "Сохранить",
"ai_settings.mcp_server.form.instructions.test_description": "один раз запускает сервис с текущими полями, проверяет обнаруженные инструменты и не сохраняет конфигурацию.",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "Транспорт",
"ai_settings.mcp_server.guide.examples.description": "В поле команды запуска указывайте только сам исполняемый файл. Не смешивайте аргументы с командой. Частые варианты:",
"ai_settings.mcp_server.guide.examples.title": "Примеры заполнения",
- "ai_settings.mcp_server.guide.field_lookup.description": "Если непонятно, что вводить в поле параметра, начните отсюда. Для каждого поля ниже есть конкретные примеры и предостережения.",
- "ai_settings.mcp_server.guide.field_lookup.title": "Краткая справка по полям",
"ai_settings.mcp_server.guide.field.args.avoid": "Не вводите npx/node/uvx/python/docker повторно и не вставляйте несколько аргументов одной длинной строкой.",
"ai_settings.mcp_server.guide.field.args.detail": "npx -y pkg --stdio разделяется на -y, pkg и --stdio. docker run --rm -i image разделяется на run, --rm, -i и image.",
"ai_settings.mcp_server.guide.field.args.fill": "Вводите -y, имя пакета, имя скрипта, -m, --stdio, run, --rm, -i, имя образа и похожие аргументы по одному.",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "Оставьте stdio.",
"ai_settings.mcp_server.guide.field.transport.summary": "Как GoNavi связывается с этим MCP Server.",
"ai_settings.mcp_server.guide.field.transport.title": "Транспорт",
+ "ai_settings.mcp_server.guide.field_lookup.description": "Если непонятно, что вводить в поле параметра, начните отсюда. Для каждого поля ниже есть конкретные примеры и предостережения.",
+ "ai_settings.mcp_server.guide.field_lookup.title": "Краткая справка по полям",
"ai_settings.mcp_server.guide.full_command.apply": "Автоматически разнести по полям ниже",
"ai_settings.mcp_server.guide.full_command.description": "Вставьте полную команду напрямую. GoNavi разделит её на команду запуска / аргументы команды / переменные окружения. Поддерживаются Unix KEY=VALUE, Windows PowerShell $env:KEY=VALUE; и префиксы cmd set KEY=VALUE &&.",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "Будет разобрано как: команда {{command}}, аргументов {{argsCount}}, переменных окружения {{envCount}}.",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "Пример: ",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "Заполнить: ",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "Рекомендуемый способ доступа:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Текущая граница:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "Локальная точка входа встроенного GoNavi MCP — stdio, она подходит для клиентов вроде Claude Code / Codex, работающих на одной машине с GoNavi.",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "Если OpenClaw/Hermans работает в облачном Linux, он не может напрямую использовать локальную Windows stdio-команду; запустите GoNavi Streamable HTTP на Windows и дайте облачному Agent доступ через туннель или reverse proxy.",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "Текущая граница:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "Команда генерации конфигурации без GUI / через CLI:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "Фрагмент конфигурации для копирования (для Agents с поддержкой mcpServers JSON):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "Текущая подсказка: {{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "Или задайте переменную окружения GONAVI_MCP_HTTP_TOKEN=, затем запустите {{standaloneCommand}}",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "Если явно требуется удаленное выполнение SQL, уберите --schema-only; execute_sql все равно остается под контролем безопасности GoNavi AI, а записи должны явно передавать allowMutating=true.",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Цель:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "Подключения к базам данных, учетные записи и пароли остаются в Windows GoNavi. Облачному Agent не нужно хранить пароли баз данных.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "Удаленный доступ по умолчанию использует режим schema-only и не регистрирует execute_sql, что подходит для выдачи OpenClaw/Hermans только доступа к структуре схемы.",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "Облачный Agent читает только результаты get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl через MCP tools.",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "Цель:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "Команда запуска CLI / службы:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. Добавьте remote MCP Server в {{displayName}}, выберите transport Streamable HTTP, укажите URL на /mcp после туннеля или reverse proxy и задайте Authorization: Bearer .",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. Сначала вызовите get_connections, чтобы получить connectionId, затем вызывайте инструменты схемы; не записывайте database host/user/password в конфигурацию облачного Agent.",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "Дополнительный промпт для сессий базы данных",
"ai_settings.prompts.field.global.description": "Применяется ко всем AI-сессиям, например «сначала дать вывод» или «отвечать кратко».",
"ai_settings.prompts.field.global.title": "Глобальный дополнительный промпт",
- "ai_settings.prompts.field.jvm_diagnostic.description": "Применяется только к рабочей области диагностики JVM, например «сначала дать план, затем команды».",
- "ai_settings.prompts.field.jvm_diagnostic.title": "Дополнительный промпт для диагностики JVM",
"ai_settings.prompts.field.jvm.description": "Применяется только к просмотру и анализу ресурсов JVM.",
"ai_settings.prompts.field.jvm.title": "Дополнительный промпт для анализа ресурсов JVM",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "Применяется только к рабочей области диагностики JVM, например «сначала дать план, затем команды».",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "Дополнительный промпт для диагностики JVM",
"ai_settings.prompts.message.save_failed": "Не удалось сохранить пользовательские промпты",
"ai_settings.prompts.message.saved": "Пользовательские промпты сохранены",
"ai_settings.prompts.placeholder.empty": "Оставьте пустым, чтобы ничего не добавлять",
"ai_settings.prompts.user.description": "Этот текст добавляется после встроенных системных промптов как system message. Используйте его для личного стиля ответа, ограничений вывода или правил команды. В вопросах безопасности системные правила по-прежнему имеют приоритет.",
"ai_settings.prompts.user.title": "Пользовательские промпты уровня пользователя",
+ "ai_settings.provider.action.add": "Добавить поставщика модели",
+ "ai_settings.provider.action.delete": "Удалить",
+ "ai_settings.provider.action.edit": "Редактировать",
+ "ai_settings.provider.auto_model": "Выбрано автоматически",
+ "ai_settings.provider.confirm_delete": "Удалить этого поставщика?",
+ "ai_settings.provider.editor.add_title": "Добавить поставщика модели",
+ "ai_settings.provider.editor.edit_title": "Редактировать поставщика модели",
+ "ai_settings.provider.empty.description": "Добавьте поставщика, чтобы начать использовать AI-ассистента",
+ "ai_settings.provider.empty.title": "Поставщик модели не настроен",
+ "ai_settings.provider.next_provider": "следующий поставщик",
+ "ai_settings.provider.no_model": "Модель не выбрана",
"ai_settings.provider_preset.anthropic.desc": "Модели Claude Opus/Sonnet",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "Пользовательская конечная точка API",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "Volcengine Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "Модели GLM-5 / GLM-5-Turbo",
"ai_settings.provider_preset.zhipu.label": "Zhipu GLM",
- "ai_settings.provider.action.add": "Добавить поставщика модели",
- "ai_settings.provider.action.delete": "Удалить",
- "ai_settings.provider.action.edit": "Редактировать",
- "ai_settings.provider.auto_model": "Выбрано автоматически",
- "ai_settings.provider.confirm_delete": "Удалить этого поставщика?",
- "ai_settings.provider.editor.add_title": "Добавить поставщика модели",
- "ai_settings.provider.editor.edit_title": "Редактировать поставщика модели",
- "ai_settings.provider.empty.description": "Добавьте поставщика, чтобы начать использовать AI-ассистента",
- "ai_settings.provider.empty.title": "Поставщик модели не настроен",
- "ai_settings.provider.next_provider": "следующий поставщик",
- "ai_settings.provider.no_model": "Модель не выбрана",
"ai_settings.safety.description": "Управляет типами SQL-операций, которые AI может выполнять, чтобы защитить данные",
"ai_settings.safety.full.desc": "AI может выполнять все операции, включая DDL. Для операций высокого риска предупреждения показываются автоматически.",
"ai_settings.safety.full.label": "Полный режим",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "База данных",
"ai_settings.skill.scope.global.desc": "Включено для всех AI-сеансов",
"ai_settings.skill.scope.global.label": "Глобально",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "Только для рабочей области диагностики JVM",
- "ai_settings.skill.scope.jvm_diagnostic.label": "Диагностика JVM",
"ai_settings.skill.scope.jvm.desc": "Только для сценариев анализа ресурсов JVM",
"ai_settings.skill.scope.jvm.label": "Ресурсы JVM",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "Только для рабочей области диагностики JVM",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "Диагностика JVM",
"ai_settings.skill.scopes_placeholder": "Выберите, где должен применяться этот Skill",
"ai_settings.skill.status.disabled": "Отключен",
"ai_settings.skill.status.enabled": "Включен",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "Необязательный",
"ai_settings.tools.parameters.required": "Обязательный",
"ai_settings.tools.parameters.type_label": "Тип: {{type}}",
- "ai_settings.tools.params_label": "Параметры:",
"ai_settings.tools.params.none": "Без параметров",
+ "ai_settings.tools.params_label": "Параметры:",
"ai_settings.tools.search.aria_label": "Поиск встроенных инструментов",
"ai_settings.tools.search.clear": "Очистить",
"ai_settings.tools.search.placeholder": "Поиск инструментов, процессов или параметров, например mcp / lineLimit / allowMutating / transaction",
"ai_settings.tools.summary": "Показано {{flowVisible}}/{{flowTotal}} рекомендуемых процессов и {{toolVisible}}/{{toolTotal}} встроенных инструментов.",
"ai_settings.tools.workflow": "💡 Процесс: get_connections → get_databases → get_tables → get_columns → сформировать SQL",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "Не удалось создать каталог конфигурации Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Неверный формат конфигурации Claude Code: {{path}} должен быть {{expected}}",
- "ai.service.mcp_client.claude_code.config_parse_failed": "Не удалось разобрать конфигурацию Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "Не удалось найти конфигурацию Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "Не удалось прочитать конфигурацию Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "Не удалось сериализовать конфигурацию Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "Не удалось записать конфигурацию Claude Code: {{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "Пользовательская конфигурация MCP для Claude Code записана. Перезапустите Claude CLI, после чего GoNavi появится в User MCPs в /mcp.",
- "ai.service.mcp_client.claude_code.status.connected": "Пользовательская конфигурация GoNavi MCP для Claude Code обнаружена и совпадает с текущим путем установки GoNavi",
- "ai.service.mcp_client.claude_code.status.missing": "Пользовательская конфигурация GoNavi MCP для Claude Code не обнаружена",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "В Claude Code обнаружена запись GoNavi MCP, но проверка текущего пути установки GoNavi не удалась: {{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "В Claude Code обнаружена запись GoNavi MCP, но она не совпадает с текущим путем установки GoNavi. Рекомендуется обновить.",
- "ai.service.mcp_client.codex.config_dir_create_failed": "Не удалось создать каталог конфигурации Codex: {{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Неверный формат конфигурации Codex: {{path}} не удалось разобрать как {{expected}}",
- "ai.service.mcp_client.codex.config_path_failed": "Не удалось найти конфигурацию Codex: {{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "Не удалось прочитать конфигурацию Codex: {{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "Не удалось записать конфигурацию Codex: {{detail}}",
- "ai.service.mcp_client.codex.install_success": "Пользовательская конфигурация MCP для Codex записана. Перезапустите Codex CLI или настольное приложение, чтобы увидеть GoNavi.",
- "ai.service.mcp_client.codex.status.connected": "Пользовательская конфигурация GoNavi MCP для Codex обнаружена и совпадает с текущим путем установки GoNavi",
- "ai.service.mcp_client.codex.status.missing": "Пользовательская конфигурация GoNavi MCP для Codex не обнаружена",
- "ai.service.mcp_client.codex.status.path_check_failed": "В Codex обнаружена запись GoNavi MCP, но проверка текущего пути установки GoNavi не удалась: {{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "В Codex обнаружена запись GoNavi MCP, но она не совпадает с текущим путем установки GoNavi. Рекомендуется обновить.",
- "ai.service.mcp_client.executable_path_empty": "Путь к текущему исполняемому файлу GoNavi пуст",
- "ai.service.mcp_client.executable_path_failed": "Не удалось найти текущий исполняемый файл GoNavi: {{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} обычно работает в облаке или удаленной среде. Подключите его к Windows GoNavi через удаленный MCP-мост; пароли баз данных остаются на этой машине GoNavi.",
- "ai.service.mcp_client.user_home_dir_unavailable": "Не удалось определить домашний каталог текущего пользователя",
"app.about.action.check_updates": "Проверить обновления",
"app.about.action.download_progress": "Ход загрузки",
"app.about.action.download_update": "Скачать обновление",
@@ -2433,8 +2433,8 @@
"app.about.hero.update_available_version": "Найдена новая версия {{version}}",
"app.about.last_checked_at": "Последняя проверка: {{time}}",
"app.about.last_checked_never": "Обновления еще не проверялись",
- "app.about.message.check_failed_with_error": "Проверка обновлений не удалась: {{error}}",
"app.about.message.channel_switch_failed_with_error": "Не удалось переключить канал обновления: {{error}}",
+ "app.about.message.check_failed_with_error": "Проверка обновлений не удалась: {{error}}",
"app.about.message.download_completed": "Загрузка обновления завершена",
"app.about.message.download_completed_with_path": "Загрузка обновления завершена. Путь к пакету: {{path}}",
"app.about.message.download_failed_with_error": "Не удалось скачать обновление: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "Браузерный mock не подключен к реальной службе MCP",
"app.browser_mock.provider.test_failed_detail": "Проверка подключения не удалась: {{detail}}",
"app.browser_mock.provider.test_success": "Проверка подключения к конечной точке выполнена успешно",
+ "app.connection.message.editable_load_failed": "Не удалось загрузить сведения сохраненного подключения. Вместо этого будет открыта маскированная конфигурация.",
+ "app.connection.message.editable_load_failed_with_detail": "Не удалось загрузить сведения сохраненного подключения: {{detail}}. Вместо этого будет открыта маскированная конфигурация.",
"app.connection_package.action.start_export": "Начать экспорт",
"app.connection_package.action.start_import": "Начать импорт",
"app.connection_package.dialog.export_title": "Экспорт подключений",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "Импортировано подключений: {{count}}. В некоторых подключениях нет паролей; отредактируйте эти подключения, введите пароли и сохраните.",
"app.connection_package.message.no_connections_to_export": "Нет подключений для экспорта",
"app.connection_package.message.unsupported_file_format": "Ошибка формата файла: поддерживаются только пакеты восстановления GoNavi, старые массивы подключений JSON, MySQL Workbench XML или Navicat NCX",
- "app.connection.message.editable_load_failed": "Не удалось загрузить сведения сохраненного подключения. Вместо этого будет открыта маскированная конфигурация.",
- "app.connection.message.editable_load_failed_with_detail": "Не удалось загрузить сведения сохраненного подключения: {{detail}}. Вместо этого будет открыта маскированная конфигурация.",
"app.data_root.action.migrate_and_switch": "Перенести существующие данные и переключиться",
"app.data_root.action.open_current": "Открыть текущий каталог",
"app.data_root.action.restore_default_directory": "Восстановить каталог по умолчанию",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "Настройки AI",
"app.settings.entry.proxy.description": "Настройка проверки обновлений, управления драйверами и общего сетевого доступа.",
"app.settings.entry.proxy.title": "Глобальный прокси",
- "app.settings.entry.web_auth.description": "Просмотр состояния аутентификации браузерного доступа и изменение пароля администратора.",
- "app.settings.entry.web_auth.title": "Аутентификация браузерного доступа",
"app.settings.entry.theme.description": "Переключение светлой или темной темы и настройка внешнего вида интерфейса.",
"app.settings.entry.theme.title": "Тема и внешний вид",
+ "app.settings.entry.web_auth.description": "Просмотр состояния аутентификации браузерного доступа и изменение пароля администратора.",
+ "app.settings.entry.web_auth.title": "Аутентификация браузерного доступа",
"app.settings.group.about.description": "Сведения о версии, ссылки на репозиторий и другая информация о продукте.",
"app.settings.group.about.title": "О приложении",
"app.settings.group.preferences.description": "Управление языком, внешним видом и отображением боковой панели.",
"app.settings.group.preferences.title": "Предпочтения",
"app.settings.group.services.description": "Настройки сетевого доступа и сервисов, связанных с AI.",
"app.settings.group.services.title": "Сервисы",
+ "app.settings.sidebar_metadata.description": "Выберите, какие метаданные таблиц показывать рядом с именами таблиц в левом дереве.",
+ "app.settings.sidebar_metadata.title": "Метаданные таблиц в боковой панели",
+ "app.settings.title": "Центр настроек",
"app.settings.web_auth.description": "Здесь можно посмотреть текущее состояние аутентификации браузерного доступа, политику сеанса и статус 2FA. После входа здесь же можно сменить пароль администратора.",
"app.settings.web_auth.load_failed": "Не удалось загрузить настройки аутентификации браузерного доступа",
"app.settings.web_auth.password.code_label": "Текущий код / код восстановления",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} ч.",
"app.settings.web_auth.value.minutes": "{{count}} мин.",
"app.settings.web_auth.value.recovery_codes": "Осталось {{count}}",
- "app.settings.sidebar_metadata.description": "Выберите, какие метаданные таблиц показывать рядом с именами таблиц в левом дереве.",
- "app.settings.sidebar_metadata.title": "Метаданные таблиц в боковой панели",
- "app.settings.title": "Центр настроек",
"app.shortcuts.action.diagnoseQuery.description": "Выполнить EXPLAIN для текущего SQL и показать план выполнения с предложениями индексов",
"app.shortcuts.action.diagnoseQuery.label": "SQL-диагностика",
+ "app.shortcuts.action.duplicateCurrentLine.description": "Дублировать строку под курсором в редакторе запросов и вставить ее ниже",
+ "app.shortcuts.action.duplicateCurrentLine.label": "Дублировать текущую строку ниже",
"app.shortcuts.action.focusSidebarSearch.description": "Перейти к полю поиска в левом дереве подключений",
"app.shortcuts.action.focusSidebarSearch.label": "Фокус на поиске боковой панели",
+ "app.shortcuts.action.formatSql.description": "Форматировать SQL в текущем редакторе запросов",
+ "app.shortcuts.action.formatSql.label": "Форматировать SQL",
"app.shortcuts.action.newConnection.description": "Создать новое подключение к базе данных, runtime или другому источнику данных",
"app.shortcuts.action.newConnection.label": "Новый источник данных",
"app.shortcuts.action.newQueryTab.description": "Создать новую вкладку SQL-запроса",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "Выполнить SQL",
"app.shortcuts.action.saveQuery.description": "Сохранить текущую вкладку запроса; для безымянных запросов откроется окно сохранения",
"app.shortcuts.action.saveQuery.label": "Сохранить запрос",
- "app.shortcuts.action.duplicateCurrentLine.description": "Дублировать строку под курсором в редакторе запросов и вставить ее ниже",
- "app.shortcuts.action.duplicateCurrentLine.label": "Дублировать текущую строку ниже",
- "app.shortcuts.action.formatSql.description": "Форматировать SQL в текущем редакторе запросов",
- "app.shortcuts.action.formatSql.label": "Форматировать SQL",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "Вручную запросить AI-автодополнение в текущем SQL-редакторе",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "Запустить AI-автодополнение SQL",
"app.shortcuts.action.selectCurrentStatement.description": "Выбрать строку под курсором в редакторе запросов и скопировать ее в буфер обмена",
"app.shortcuts.action.selectCurrentStatement.label": "Выбрать текущую строку и скопировать",
"app.shortcuts.action.sendAIChatMessage.description": "Отправить текущее сообщение из поля ввода AI; Shift+Enter всегда вставляет новую строку",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "Переключить область результатов",
"app.shortcuts.action.toggleTheme.description": "Переключение между светлой и темной темами",
"app.shortcuts.action.toggleTheme.label": "Переключить тему",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "Вручную запросить AI-автодополнение в текущем SQL-редакторе",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "Запустить AI-автодополнение SQL",
"app.shortcuts.capture_hint": "Нажмите сочетание клавиш после нажатия \"Записать\". Нажмите Esc, чтобы отменить запись. Для глобальных горячих клавиш рекомендуется модификатор; отправка AI-чата поддерживает только комбинации с Enter, а Shift+Enter сохраняет перенос строки.",
"app.shortcuts.capture_waiting": "Нажмите сочетание клавиш...",
"app.shortcuts.context.datagrid": "Таблица данных",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "Загрузка локальной конфигурации...",
"app.startup_readiness.loading_security_config": "Загрузка конфигурации безопасности...",
"app.theme.action.restore_defaults": "Восстановить значения по умолчанию",
- "app.theme.appearance_settings_description": "Единая настройка масштаба, размера шрифта, прозрачности и размытия.",
- "app.theme.appearance_settings_title": "Настройки внешнего вида",
"app.theme.appearance.blur_hint": "* Управляет размытием только внутренних оверлейных слоев приложения",
"app.theme.appearance.blur_title": "Гауссово размытие (Blur)",
"app.theme.appearance.enable_transparency_blur": "Включить прозрачность и размытие",
"app.theme.appearance.enable_transparency_blur_hint": "При отключении текущие пороги сохраняются и будут восстановлены при повторном включении.",
"app.theme.appearance.font_size_title": "Базовый размер шрифта (Font Size)",
"app.theme.appearance.opacity_title": "Непрозрачность фона (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "Влияет только на левую навигационную панель V2 и помогает увеличить кнопки и значки подключений на больших экранах.",
+ "app.theme.appearance.sidebar_rail_scale_title": "Размер кнопок левой навигации",
"app.theme.appearance.transparency_blur_title": "Эффекты прозрачности и размытия",
"app.theme.appearance.ui_scale_hint": "* Для небольших экранов рекомендуется 85%-95%",
"app.theme.appearance.ui_scale_title": "Масштаб UI (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "Влияет только на левую навигационную панель V2 и помогает увеличить кнопки и значки подключений на больших экранах.",
- "app.theme.appearance.sidebar_rail_scale_title": "Размер кнопок левой навигации",
"app.theme.appearance.windows_acrylic_hint": "Windows использует системный эффект Acrylic. Сила размытия управляется системой.",
+ "app.theme.appearance_settings_description": "Единая настройка масштаба, размера шрифта, прозрачности и размытия.",
+ "app.theme.appearance_settings_title": "Настройки внешнего вида",
"app.theme.data_table.column_width_hint": "В стандартном режиме ширина столбца по умолчанию 200px; в компактном режиме 140px. Вручную измененные ширины столбцов сохраняются в приоритете.",
"app.theme.data_table.column_width_mode": "Режим ширины столбцов таблицы данных",
"app.theme.data_table.column_width_mode.compact": "Компактный 140px",
"app.theme.data_table.column_width_mode.standard": "Стандартный 200px",
"app.theme.data_table.density": "Плотность таблицы",
- "app.theme.data_table.density_hint": "Управляет высотой строк, шириной столбцов и отступами. Комфортная плотность удобна для больших экранов; компактная увеличивает плотность информации. Ширина столбцов, измененная вручную, сохраняется в приоритете.",
"app.theme.data_table.density.comfortable": "Комфортная",
"app.theme.data_table.density.compact": "Компактная",
"app.theme.data_table.density.standard": "Стандартная",
+ "app.theme.data_table.density_hint": "Управляет высотой строк, шириной столбцов и отступами. Комфортная плотность удобна для больших экранов; компактная увеличивает плотность информации. Ширина столбцов, измененная вручную, сохраняется в приоритете.",
"app.theme.data_table.follow_global": "Следовать глобально",
"app.theme.data_table.font_size": "Размер шрифта таблицы данных",
"app.theme.data_table.sidebar_tree_font_size": "Размер шрифта левого дерева схем",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "Моноширинное семейство шрифтов",
"app.theme.font_family.title": "Семейство шрифтов",
"app.theme.font_family.ui_title": "Семейство шрифтов UI",
- "app.theme.query_template.description": "Настройте SQL, который будет автоматически подставляться при открытии новой вкладки запроса.",
- "app.theme.query_template.hint": "Очистите текст, чтобы новые вкладки запроса открывались пустыми. Кнопка восстановления вернет SELECT * FROM .",
- "app.theme.query_template.reset_default": "Восстановить по умолчанию",
- "app.theme.query_template.title": "SQL по умолчанию для нового запроса",
"app.theme.mac_window.restart_hint": "* Пользовательские кнопки справа вверху скрыты. Если системный стиль окна не обновился сразу, перезапустите приложение.",
"app.theme.mac_window.title": "Управление окном macOS",
"app.theme.mac_window.use_native_controls": "Использовать нативные элементы управления окном macOS",
"app.theme.mac_window.use_native_controls_hint": "Показывает красную, желтую и зеленую кнопки слева вверху и отдает приоритет нативному полноэкранному поведению macOS.",
- "app.theme.mode_title": "Режим темы",
"app.theme.mode.dark.description": "Подходит для слабого освещения и более спокойного визуального восприятия.",
"app.theme.mode.dark.label": "Темная тема",
"app.theme.mode.light.description": "Подходит для яркой среды и более легкой визуальной иерархии.",
"app.theme.mode.light.label": "Светлая тема",
"app.theme.mode.system.description": "Следует за оформлением системы и переключается автоматически.",
"app.theme.mode.system.label": "Как в системе",
+ "app.theme.mode_title": "Режим темы",
"app.theme.nav.appearance.description": "Масштаб, шрифт и прозрачность",
"app.theme.nav.appearance.title": "Параметры внешнего вида",
"app.theme.nav.theme.description": "Переключение светлой и темной темы",
"app.theme.nav.theme.title": "Режим темы",
"app.theme.navigation_title": "Навигация по настройкам",
+ "app.theme.query_template.description": "Настройте SQL, который будет автоматически подставляться при открытии новой вкладки запроса.",
+ "app.theme.query_template.hint": "Очистите текст, чтобы новые вкладки запроса открывались пустыми. Кнопка восстановления вернет SELECT * FROM .",
+ "app.theme.query_template.reset_default": "Восстановить по умолчанию",
+ "app.theme.query_template.title": "SQL по умолчанию для нового запроса",
"app.theme.startup_window.fullscreen": "Полный экран при запуске",
"app.theme.startup_window.fullscreen_windows": "Полный экран при запуске (Windows обрабатывает это как максимизацию)",
"app.theme.startup_window.hint": "* Вступает в силу при следующем запуске",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "Скрыть в фон",
"app.update.action.install_update": "Установить обновление",
"app.update.action.open_install_directory": "Открыть каталог установки",
+ "app.update.backend.error.channel_invalid": "Недопустимый канал обновления: {{channel}}",
"app.update.backend.error.check_failed": "Не удалось проверить обновления: {{detail}}",
"app.update.backend.error.check_http_status": "Не удалось проверить обновления: HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "Недопустимый канал обновления: {{channel}}",
"app.update.backend.error.download_failed": "Не удалось скачать обновление: {{detail}}",
+ "app.update.backend.error.install_target_not_writable": "Текущий каталог установки недоступен для записи: {{path}} ({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "Не удалось определить текущий каталог установки",
"app.update.backend.error.install_unsupported": "Установка обновления не поддерживается на этой платформе: {{platform}}",
"app.update.backend.error.latest_version_unparseable": "Не удалось разобрать номер последней версии",
"app.update.backend.error.network_dns": "Не удалось подключиться к GitHub: не удалось разрешить {{host}}. Убедитесь, что глобальный прокси применен, или сначала проверьте подключение в настройках глобального прокси.",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS не содержит пакет обновления для текущей платформы",
"app.update.backend.error.sha256sums_download_failed": "Не удалось скачать SHA256SUMS: HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release не предоставляет SHA256SUMS",
- "app.update.backend.error.install_target_not_writable": "Текущий каталог установки недоступен для записи: {{path}} ({{detail}})",
- "app.update.backend.error.install_target_unresolved": "Не удалось определить текущий каталог установки",
"app.update.backend.error.update_package_not_found": "Пакет обновления не найден: {{name}}",
"app.update.backend.message.app_directory_unavailable": "Нет доступа к каталогу приложения: {{path}}",
"app.update.backend.message.app_directory_unresolved_download": "Не удалось определить текущий каталог приложения, поэтому обновление нельзя скачать",
@@ -3015,6 +3015,64 @@
"common.success": "Успешно",
"common.unknown": "Неизвестно",
"common.warning": "Предупреждение",
+ "connection.backend.action.apply_result_changes": "Применить изменения результата",
+ "connection.backend.action.clear_table": "Очистить данные таблицы",
+ "connection.backend.action.create_database": "Создать базу данных",
+ "connection.backend.action.create_schema": "Создать схему",
+ "connection.backend.action.data_sync_structure": "Изменить структуру цели синхронизации",
+ "connection.backend.action.data_sync_write": "Записать синхронизированные данные",
+ "connection.backend.action.drop_database": "Удалить базу данных",
+ "connection.backend.action.drop_function_or_procedure": "Удалить функцию или хранимую процедуру",
+ "connection.backend.action.drop_schema": "Удалить схему",
+ "connection.backend.action.drop_table": "Удалить таблицу",
+ "connection.backend.action.drop_view": "Удалить представление",
+ "connection.backend.action.import_data": "Импортировать данные",
+ "connection.backend.action.preview_result_changes": "Предпросмотр изменений результата",
+ "connection.backend.action.rename_database": "Переименовать базу данных",
+ "connection.backend.action.rename_schema": "Переименовать схему",
+ "connection.backend.action.rename_table": "Переименовать таблицу",
+ "connection.backend.action.rename_view": "Переименовать представление",
+ "connection.backend.action.truncate_table": "Очистить таблицу через TRUNCATE",
+ "connection.backend.error.readonly_action_blocked": "Для этого подключения включена защита production, операция «{{action}}» запрещена.",
+ "connection.copy_suffix": " - копия",
+ "connection.delete": "Удалить подключение",
+ "connection.edit": "Изменить подключение",
+ "connection.new": "Новое подключение",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase поддерживает только tenant-протоколы MySQL/Oracle; \"{{value}}\" не поддерживается. Переключитесь на MySQL или Oracle.",
+ "connection.sidebar.delete.backendUnavailable": "Не удалось удалить подключение: интерфейс бэкенда недоступен",
+ "connection.sidebar.delete.confirmContent": "Удалить подключение \"{{name}}\"?",
+ "connection.sidebar.delete.confirmTitle": "Подтвердить удаление",
+ "connection.sidebar.delete.failureFallback": "Не удалось удалить подключение",
+ "connection.sidebar.delete.success": "Подключение удалено",
+ "connection.sidebar.disconnect.success": "Подключение отключено",
+ "connection.sidebar.duplicate.backendUnavailable": "Не удалось скопировать подключение: интерфейс бэкенда недоступен",
+ "connection.sidebar.duplicate.failureFallback": "Не удалось скопировать подключение",
+ "connection.sidebar.duplicate.noResult": "Не удалось скопировать подключение: бэкенд не вернул результат",
+ "connection.sidebar.duplicate.success": "Подключение скопировано: {{name}}",
+ "connection.sidebar.group.badge": "Группа",
+ "connection.sidebar.group.collapseAria": "Свернуть группу подключений {{name}}",
+ "connection.sidebar.group.delete": "Удалить группу",
+ "connection.sidebar.group.deleteConfirmContent": "Удалить группу \"{{name}}\"? Подключения внутри останутся.",
+ "connection.sidebar.group.deleteConfirmTitle": "Подтвердить удаление",
+ "connection.sidebar.group.edit": "Изменить группу",
+ "connection.sidebar.group.expandAria": "Развернуть группу подключений {{name}}",
+ "connection.sidebar.group.meta": "{{count}} подключений · Группа подключений",
+ "connection.sidebar.group.untitled": "Группа без имени",
+ "connection.sidebar.menu.copy": "Копировать подключение",
+ "connection.sidebar.menu.createDatabase": "Новая база данных",
+ "connection.sidebar.menu.current": "Текущий",
+ "connection.sidebar.menu.delete": "Удалить подключение",
+ "connection.sidebar.menu.disconnect": "Отключить",
+ "connection.sidebar.menu.groupSection": "Группы подключений",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "Адрес не указан",
+ "connection.sidebar.menu.moveOutTag": "Убрать из тега",
+ "connection.sidebar.menu.moveToTag": "Переместить в тег",
+ "connection.sidebar.menu.moveToUngrouped": "Убрать из группы",
+ "connection.sidebar.menu.refresh": "Обновить подключение",
+ "connection.sidebar.menu.section": "Подключение",
+ "connection.test": "Проверить подключение",
+ "connection.unnamed": "Безымянное подключение",
"connection_modal.action.browse": "Выбрать...",
"connection_modal.action.cancel": "Отмена",
"connection_modal.action.close": "Закрыть",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "Введите, сформируйте или разберите URI подключения.",
"connection_modal.config_section.uri.title": "URI подключения",
"connection_modal.db_icon_label.custom": "Пользовательский",
+ "connection_modal.db_type.custom": "Пользовательский",
"connection_modal.db_type_hint.custom": "Подключение с пользовательским драйвером и DSN.",
"connection_modal.db_type_hint.file": "Выберите локальный файл базы данных SQLite или DuckDB.",
"connection_modal.db_type_hint.mongodb": "Подключение к MongoDB Standalone, Replica Set или SRV-адресам.",
"connection_modal.db_type_hint.redis": "Подключение к Redis Standalone или Redis Cluster.",
"connection_modal.db_type_hint.standard": "Введите хост, порт, данные аутентификации и необязательную базу данных.",
- "connection_modal.db_type.custom": "Пользовательский",
"connection_modal.driver.current": "Текущий",
"connection_modal.error.unknown": "Неизвестная ошибка",
"connection_modal.error.unknown_exception": "Неизвестная ошибка",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "Имя подключения",
"connection_modal.field.connection_timeout_seconds": "Тайм-аут подключения (секунды)",
"connection_modal.field.connection_timeout_seconds_ascii": "Тайм-аут подключения (секунды)",
- "connection_modal.field.default_database_optional": "База данных по умолчанию (необязательно)",
"connection_modal.field.defaultDatabase.placeholder": "Например: appdb",
+ "connection_modal.field.default_database_optional": "База данных по умолчанию (необязательно)",
"connection_modal.field.display_databases_optional": "Отображаемые базы данных (необязательно)",
- "connection_modal.field.driver_name": "драйвер имя",
"connection_modal.field.driver.placeholder": "Например: mysql, postgres",
+ "connection_modal.field.driver_name": "драйвер имя",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "Например: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "Путь к файлу (абсолютный)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Имя пользователя Replica Set (необязательно)",
"connection_modal.field.replica_username_optional": "Имя пользователя реплики (необязательно)",
"connection_modal.field.save_password": "Сохранить пароль",
- "connection_modal.field.service_name": "Имя сервиса",
"connection_modal.field.serviceName.placeholder": "Например: ORCLPDB1",
+ "connection_modal.field.service_name": "Имя сервиса",
"connection_modal.field.ssh_host": "SSH-хост",
"connection_modal.field.ssh_password": "SSH-пароль",
"connection_modal.field.ssh_user": "SSH-пользователь",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "Подключение через GoNavi Agent, когда прямой сетевой доступ ограничен.",
"connection_modal.jvm.agent_help": "Базовый URL сервиса GoNavi Agent.",
"connection_modal.jvm.agent_url": "URL Agent",
- "connection_modal.jvm.diagnostic_api_key_optional": "Ключ API диагностики (необязательно)",
- "connection_modal.jvm.diagnostic_description": "Включить необязательные диагностические команды для устранения неполадок JVM.",
- "connection_modal.jvm.diagnostic_disabled_hint": "Диагностическое расширение отключено. Включайте его только для диагностики во время выполнения.",
- "connection_modal.jvm.diagnostic_timeout_seconds": "Тайм-аут диагностики (секунды)",
- "connection_modal.jvm.diagnostic_title": "Диагностическое расширение",
- "connection_modal.jvm.diagnostic_transport": "Диагностический транспорт",
"connection_modal.jvm.diagnostic.agent_bridge_description": "Использовать диагностический Endpoint GoNavi Agent Bridge.",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "Использовать Arthas Tunnel для доступа к целевой JVM.",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Базовый URL сервера Arthas Tunnel.",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "Разрешить trace и watch команды, которые добавляют нагрузку во время выполнения.",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "Ключ API диагностики (необязательно)",
+ "connection_modal.jvm.diagnostic_description": "Включить необязательные диагностические команды для устранения неполадок JVM.",
+ "connection_modal.jvm.diagnostic_disabled_hint": "Диагностическое расширение отключено. Включайте его только для диагностики во время выполнения.",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "Тайм-аут диагностики (секунды)",
+ "connection_modal.jvm.diagnostic_title": "Диагностическое расширение",
+ "connection_modal.jvm.diagnostic_transport": "Диагностический транспорт",
"connection_modal.jvm.endpoint_api_key_optional": "Ключ API Endpoint (необязательно)",
"connection_modal.jvm.endpoint_description": "Подключаться к предоставленному сервисом Endpoint вместо прямого JMX.",
"connection_modal.jvm.endpoint_help": "Базовый URL Endpoint управления JVM.",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "Настраивает один NameServer для локальной или простой среды.",
"connection_modal.messageQueue.rocketmq.topology.single.label": "Один NameServer",
"connection_modal.messageQueue.topology.cluster.label": "Режим кластера",
- "connection_modal.mongodb.auth_mechanism": "Механизм аутентификации",
"connection_modal.mongodb.auth.auto": "Авто",
"connection_modal.mongodb.auth.auto_description": "Позволить драйверу выбрать механизм аутентификации.",
"connection_modal.mongodb.auth.aws_iam_description": "Использовать аутентификацию AWS IAM. Учетные данные AWS IAM должны быть в среде выполнения.",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "Подключаться без аутентификации MongoDB.",
"connection_modal.mongodb.auth.scram_sha1_description": "Использовать аутентификацию SCRAM-SHA-1.",
"connection_modal.mongodb.auth.scram_sha256_description": "Использовать аутентификацию SCRAM-SHA-256.",
+ "connection_modal.mongodb.auth_mechanism": "Механизм аутентификации",
"connection_modal.mongodb.discovery.current": "Текущий",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "Если SRV и SSH Tunnel включены одновременно, может потребоваться локальное DNS-разрешение.",
"connection_modal.mongodb.discovery.srv.description": "Использовать mongodb+srv, чтобы DNS обнаружил целевые узлы.",
"connection_modal.mongodb.discovery.srv.label": "SRV-адрес",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "Если SRV и SSH Tunnel включены одновременно, может потребоваться локальное DNS-разрешение.",
"connection_modal.mongodb.discovery.standard.description": "Подключение напрямую через host:port или список узлов Replica Set.",
"connection_modal.mongodb.discovery.standard.label": "Стандартный адрес",
"connection_modal.mongodb.members.health": "Состояние",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "Вкл",
"connection_modal.table.health": "Состояние",
"connection_modal.table.role": "Роль",
+ "connection_modal.test.redis_database_list_failure": "Подключение успешно, но не удалось загрузить список баз данных Redis: {{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "Подключение успешно, но загрузка списка баз данных Redis превысила время ожидания (>{{seconds}} сек.)",
"connection_modal.test_error.description": "Просмотрите полный текст ошибки, возвращенной backend.",
"connection_modal.test_error.empty": "Нет сведений об ошибке",
"connection_modal.test_error.title": "Сведения об ошибке проверки подключения",
- "connection_modal.test.redis_database_list_failure": "Подключение успешно, но не удалось загрузить список баз данных Redis: {{detail}}",
- "connection_modal.test.redis_database_list_timeout": "Подключение успешно, но загрузка списка баз данных Redis превысила время ожидания (>{{seconds}} сек.)",
"connection_modal.title.create": "Новое подключение {{type}}",
"connection_modal.title.create_description": "Введите и сохраните конфигурацию подключения.",
"connection_modal.title.edit": "Изменить подключение",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "Введите хост HTTP Tunnel",
"connection_modal.validation.tunnel_port_required": "Введите порт HTTP Tunnel",
"connection_modal.validation.username_required": "Введите имя пользователя",
- "connection.backend.action.apply_result_changes": "Применить изменения результата",
- "connection.backend.action.clear_table": "Очистить данные таблицы",
- "connection.backend.action.create_database": "Создать базу данных",
- "connection.backend.action.create_schema": "Создать схему",
- "connection.backend.action.data_sync_structure": "Изменить структуру цели синхронизации",
- "connection.backend.action.data_sync_write": "Записать синхронизированные данные",
- "connection.backend.action.drop_database": "Удалить базу данных",
- "connection.backend.action.drop_function_or_procedure": "Удалить функцию или хранимую процедуру",
- "connection.backend.action.drop_schema": "Удалить схему",
- "connection.backend.action.drop_table": "Удалить таблицу",
- "connection.backend.action.drop_view": "Удалить представление",
- "connection.backend.action.import_data": "Импортировать данные",
- "connection.backend.action.preview_result_changes": "Предпросмотр изменений результата",
- "connection.backend.action.rename_database": "Переименовать базу данных",
- "connection.backend.action.rename_schema": "Переименовать схему",
- "connection.backend.action.rename_table": "Переименовать таблицу",
- "connection.backend.action.rename_view": "Переименовать представление",
- "connection.backend.action.truncate_table": "Очистить таблицу через TRUNCATE",
- "connection.backend.error.readonly_action_blocked": "Для этого подключения включена защита production, операция «{{action}}» запрещена.",
- "connection.copy_suffix": " - копия",
- "connection.delete": "Удалить подключение",
- "connection.edit": "Изменить подключение",
- "connection.new": "Новое подключение",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase поддерживает только tenant-протоколы MySQL/Oracle; \"{{value}}\" не поддерживается. Переключитесь на MySQL или Oracle.",
- "connection.sidebar.delete.backendUnavailable": "Не удалось удалить подключение: интерфейс бэкенда недоступен",
- "connection.sidebar.delete.confirmContent": "Удалить подключение \"{{name}}\"?",
- "connection.sidebar.delete.confirmTitle": "Подтвердить удаление",
- "connection.sidebar.delete.failureFallback": "Не удалось удалить подключение",
- "connection.sidebar.delete.success": "Подключение удалено",
- "connection.sidebar.disconnect.success": "Подключение отключено",
- "connection.sidebar.duplicate.backendUnavailable": "Не удалось скопировать подключение: интерфейс бэкенда недоступен",
- "connection.sidebar.duplicate.failureFallback": "Не удалось скопировать подключение",
- "connection.sidebar.duplicate.noResult": "Не удалось скопировать подключение: бэкенд не вернул результат",
- "connection.sidebar.duplicate.success": "Подключение скопировано: {{name}}",
- "connection.sidebar.group.badge": "Группа",
- "connection.sidebar.group.collapseAria": "Свернуть группу подключений {{name}}",
- "connection.sidebar.group.delete": "Удалить группу",
- "connection.sidebar.group.deleteConfirmContent": "Удалить группу \"{{name}}\"? Подключения внутри останутся.",
- "connection.sidebar.group.deleteConfirmTitle": "Подтвердить удаление",
- "connection.sidebar.group.edit": "Изменить группу",
- "connection.sidebar.group.expandAria": "Развернуть группу подключений {{name}}",
- "connection.sidebar.group.meta": "{{count}} подключений · Группа подключений",
- "connection.sidebar.group.untitled": "Группа без имени",
- "connection.sidebar.menu.copy": "Копировать подключение",
- "connection.sidebar.menu.createDatabase": "Новая база данных",
- "connection.sidebar.menu.current": "Текущий",
- "connection.sidebar.menu.delete": "Удалить подключение",
- "connection.sidebar.menu.disconnect": "Отключить",
- "connection.sidebar.menu.groupSection": "Группы подключений",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "Адрес не указан",
- "connection.sidebar.menu.moveOutTag": "Убрать из тега",
- "connection.sidebar.menu.moveToTag": "Переместить в тег",
- "connection.sidebar.menu.moveToUngrouped": "Убрать из группы",
- "connection.sidebar.menu.refresh": "Обновить подключение",
- "connection.sidebar.menu.section": "Подключение",
- "connection.test": "Проверить подключение",
- "connection.unnamed": "Безымянное подключение",
"data_export.action.clear": "Очистить",
"data_export.action.clear_progress": "Очистить текущий прогресс",
"data_export.action.select_all": "Выбрать всё",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "Сейчас",
"data_grid.cell_editor.title": "Редактировать ячейку",
"data_grid.cell_editor.title_with_column": "Редактировать ячейку: {{column}}",
+ "data_grid.column.comment_tooltip": "Комментарий: {{comment}}",
+ "data_grid.column.drag_tooltip": "Перетащите, чтобы изменить порядок столбцов",
+ "data_grid.column.foreign_key_jump_title": "Перейти к таблице внешнего ключа: {{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "Внешний ключ: {{target}}",
+ "data_grid.column.resize_tooltip": "Перетащите, чтобы изменить ширину столбца; двойной щелчок подгонит автоматически",
+ "data_grid.column.type_tooltip": "Тип: {{type}}",
"data_grid.column_quick_find.placeholder": "Перейти к столбцу...",
"data_grid.column_quick_find.tooltip": "Введите имя столбца, затем нажмите Enter или кнопку перехода, чтобы перейти к этому столбцу",
"data_grid.column_settings.column_visibility": "Видимость столбцов",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "Показать все",
"data_grid.column_settings.show_comments": "Показывать комментарии столбцов в заголовке",
"data_grid.column_settings.show_types": "Показывать типы столбцов в заголовке",
- "data_grid.column.comment_tooltip": "Комментарий: {{comment}}",
- "data_grid.column.drag_tooltip": "Перетащите, чтобы изменить порядок столбцов",
- "data_grid.column.foreign_key_jump_title": "Перейти к таблице внешнего ключа: {{tableName}}",
- "data_grid.column.foreign_key_tooltip": "Внешний ключ: {{target}}",
- "data_grid.column.resize_tooltip": "Перетащите, чтобы изменить ширину столбца; двойной щелчок подгонит автоматически",
- "data_grid.column.type_tooltip": "Тип: {{type}}",
"data_grid.context_menu.auto_fit_column": "Подогнать ширину столбца по содержимому",
"data_grid.context_menu.clear_column_sort": "Сбросить сортировку этого поля",
"data_grid.context_menu.column_display_section": "Отображение поля",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "Строки не выбраны. Выберите область экспорта:",
"data_grid.export.options_title": "Параметры экспорта",
"data_grid.export.query_result_title": "Экспорт результатов запроса",
- "data_grid.export.scope_prompt": "Выберите область экспорта:",
"data_grid.export.scope.all_results_cached": "Все результаты (текущий кэш {{count}} строк)",
"data_grid.export.scope.all_results_cached_description": "Экспортирует все результаты из текущего кэша, если текущий запрос нельзя воспроизвести повторно.",
"data_grid.export.scope.all_results_requery": "Все результаты (повторный запрос)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "Выбранные строки",
"data_grid.export.scope.selected_rows_count": "Выбранные строки ({{count}} строк)",
"data_grid.export.scope.selected_rows_description": "Экспортирует только отмеченные строки из текущего набора результатов.",
+ "data_grid.export.scope_prompt": "Выберите область экспорта:",
"data_grid.export.selected_rows": "Экспорт выбранных строк ({{count}})",
"data_grid.filter.add_condition": "Добавить условие",
"data_grid.filter.add_sort": "Добавить сортировку",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "ОК",
"data_grid.pagination.jump_aria": "Перейти на страницу",
"data_grid.pagination.jump_label": "Перейти",
- "data_grid.pagination.page_size_aria": "Строк на странице",
- "data_grid.pagination.page_size_option": "{{count}} строк / страница",
"data_grid.pagination.page.current": "Страница {{current}}",
"data_grid.pagination.page.known": "Страница {{current}} / {{totalPages}}",
+ "data_grid.pagination.page_size_aria": "Строк на странице",
+ "data_grid.pagination.page_size_option": "{{count}} строк / страница",
"data_grid.pagination.result_set": "Набор результатов",
"data_grid.pagination.summary.approximate": "Сейчас {{current}} строк / около {{total}} строк",
"data_grid.pagination.summary.cancelled": "Сейчас {{current}} строк / подсчет отменен",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "Настроить источник и цель",
"data_sync.step.result": "Результат выполнения",
"data_sync.step.select_tables": "Выбрать таблицы",
- "data_sync.table_picker.help": "Выберите таблицы для синхронизации:",
- "data_sync.table_picker.item_unit": "элемент",
- "data_sync.table_picker.items_unit": "элементы",
- "data_sync.table_picker.not_found": "Нет данных",
- "data_sync.table_picker.search_placeholder": "Поиск таблиц...",
- "data_sync.table_picker.selected_title": "Выбранные таблицы",
- "data_sync.table_picker.show_same": "Показывать совпадающие таблицы",
- "data_sync.table_picker.source_title": "Таблицы источника",
"data_sync.table.delete": "Удаление",
"data_sync.table.insert": "Вставка",
"data_sync.table.plan": "План",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "Нет",
"data_sync.table.target_table": "Целевая таблица",
"data_sync.table.update": "Обновление",
+ "data_sync.table_picker.help": "Выберите таблицы для синхронизации:",
+ "data_sync.table_picker.item_unit": "элемент",
+ "data_sync.table_picker.items_unit": "элементы",
+ "data_sync.table_picker.not_found": "Нет данных",
+ "data_sync.table_picker.search_placeholder": "Поиск таблиц...",
+ "data_sync.table_picker.selected_title": "Выбранные таблицы",
+ "data_sync.table_picker.show_same": "Показывать совпадающие таблицы",
+ "data_sync.table_picker.source_title": "Таблицы источника",
"data_sync.title.compare_result": "Результат сравнения",
"data_sync.title.execution_log": "Журнал выполнения",
"data_sync.title.migration": "Миграция между источниками данных",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "Подключение к базе данных не найдено",
"definition_viewer.error.event_name_empty": "Имя события пустое",
"definition_viewer.error.load_failed": "Не удалось загрузить",
+ "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.query_failed": "Не удалось запросить определение",
"definition_viewer.error.query_failed_detail": "Не удалось запросить определение: {{detail}}",
- "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.routine_name_empty": "Имя функции/процедуры пустое",
"definition_viewer.error.sequence_name_empty": "Sequence name is empty",
"definition_viewer.error.view_name_empty": "Имя представления пустое",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "старый",
"dev.perf_data_grid.ui_version.v2": "Новый UI",
"dev.perf_data_grid.ui_version.v2_short": "новый",
+ "driver.guidance.customConnectionDriverHelp": "Поддерживаются: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; псевдонимы: postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Укажите имя драйвера Go database/sql, уже зарегистрированного в GoNavi. Не вводите напрямую имя системного драйвера ODBC/JDBC и не импортируйте JDBC Jar.",
"driver_manager.action.close": "Закрыть",
"driver_manager.action.import_directory": "Импортировать каталог драйверов",
"driver_manager.action.import_package": "Импортировать пакет драйвера",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "Строчное действие «Импортировать пакет драйвера» предназначено только для отдельного файла драйвера или архива, например `mariadb-driver-agent`, `mariadb-driver-agent.exe` или `GoNavi-DriverAgents.zip`. Прямой импорт JDBC Jar не поддерживается; для пакетного импорта используйте «Импортировать каталог драйверов» выше.",
"driver_manager.local_source.directory": "каталог",
"driver_manager.local_source.file": "файл",
- "driver_manager.log_modal.empty": "Для этого драйвера пока нет журналов операций.",
- "driver_manager.log_modal.executable_path": "Исполняемый файл драйвера: {{path}}",
- "driver_manager.log_modal.install_dir": "Каталог установки: {{path}}",
- "driver_manager.log_modal.title": "Журнал драйвера - {{name}}",
"driver_manager.log.done_auto_install": "Автоматическая установка завершена{{version}}",
"driver_manager.log.done_local_import": "Установка через локальный импорт завершена{{version}}",
"driver_manager.log.done_remove": "Удаление драйвера завершено",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "Начата автоматическая установка",
"driver_manager.log.start_local_import": "Начат локальный импорт{{version}} ({{source}}): {{path}}",
"driver_manager.log.start_remove": "Начато удаление драйвера",
+ "driver_manager.log_modal.empty": "Для этого драйвера пока нет журналов операций.",
+ "driver_manager.log_modal.executable_path": "Исполняемый файл драйвера: {{path}}",
+ "driver_manager.log_modal.install_dir": "Каталог установки: {{path}}",
+ "driver_manager.log_modal.title": "Журнал драйвера - {{name}}",
"driver_manager.message.directory_import_completed": "Импорт каталога завершен{{mode}}: успешно {{success}}{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "Импорт каталога завершен{{mode}}: успешно {{success}}, с ошибкой {{failed}}{{skip}}",
"driver_manager.message.directory_import_failed": "Импорт каталога не удался{{mode}}: с ошибкой {{failed}}{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "Не удалось выбрать локальный каталог пакета драйвера: {{detail}}",
"driver_manager.message.select_local_file_failed": "Не удалось выбрать локальный файл пакета драйвера",
"driver_manager.message.select_local_file_failed_detail": "Не удалось выбрать локальный файл пакета драйвера: {{detail}}",
- "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.message.skip.dedupe": "Пропущено дублей: {{count}}",
"driver_manager.message.skip.slim": "Пропущено slim-сборок: {{count}}",
+ "driver_manager.message.skip_suffix": ", {{items}}",
"driver_manager.network.alert.download_chain_unreachable": "Важно: домены маршрута загрузки драйверов недоступны",
"driver_manager.network.alert.download_network_unreachable": "Важно: сеть загрузки драйверов недоступна",
"driver_manager.network.chain_alert.allow_hosts": "Если ошибка сохраняется, разрешите эти узлы в правилах прокси: {{hosts}}. Если правила изменить нельзя, рассмотрите включение режима TUN.",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "Сейчас установлена {{installedVersion}}; выбрана {{targetVersion}}. Нажмите «Переключить версию», чтобы применить.",
"driver_manager.version.target_fallback": "целевая версия",
"driver_manager.version.unlabeled": "Версия не указана",
- "driver.guidance.customConnectionDriverHelp": "Поддерживаются: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase; псевдонимы: postgresql/pgx, open_gauss/open-gauss, dm8, kingbase8/kingbasees/kingbasev8. Укажите имя драйвера Go database/sql, уже зарегистрированного в GoNavi. Не вводите напрямую имя системного драйвера ODBC/JDBC и не импортируйте JDBC Jar.",
"file.backend.dialog.export_connections": "Экспорт подключений",
"file.backend.dialog.export_data": "Экспорт данных",
"file.backend.dialog.export_database_sql": "Экспорт {{database}} (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "Импорт данных...",
"import_preview.status.loading_preview": "Загрузка данных предпросмотра...",
"import_preview.title": "Предпросмотр импорта данных",
+ "jvm.backend.capability.reason.read_only": "Текущее подключение доступно только для чтения",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "Укажите полный URL http:// или https://, например http://127.0.0.1:19090/gonavi/agent/jvm.",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Подключение Agent не удалось: Agent Base URL недействителен.",
+ "jvm.backend.connection_error.agent.base_url_required": "Подключение Agent не удалось: Agent Base URL отсутствует.",
+ "jvm.backend.connection_error.agent.connection_refused.help": "Убедитесь, что Java service запущен с GoNavi Agent через `-javaagent`, и проверьте Base URL, port mapping и правила firewall.",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Подключение Agent не удалось: целевой management port Agent не слушается или адрес недоступен.",
+ "jvm.backend.connection_error.agent.forbidden.help": "Убедитесь, что источник клиента, настройки authentication и access policy Agent разрешают GoNavi доступ.",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Подключение Agent не удалось: Agent отклонил этот запрос.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "Измените Agent Base URL на адрес, начинающийся с http:// или https://.",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Подключение Agent не удалось: поддерживаются только HTTP или HTTPS.",
+ "jvm.backend.connection_error.agent.timeout.help": "Убедитесь, что целевой адрес доступен, Agent запущен, и при необходимости увеличьте connection timeout.",
+ "jvm.backend.connection_error.agent.timeout.summary": "Подключение Agent не удалось: истекло время ожидания доступа к management port Agent.",
+ "jvm.backend.connection_error.agent.unauthorized.help": "Проверьте, совпадает ли Agent API Key в подключении с параметрами запуска целевого сервиса.",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Подключение Agent не удалось: Agent ответил, но API Key отсутствует или недействителен.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Укажите полный URL http:// или https://, который указывает на корневой путь management API, реализующего GoNavi JVM HTTP contract, например http://127.0.0.1:19090/manage/jvm.",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Подключение Endpoint не удалось: Endpoint Base URL недействителен.",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Подключение Endpoint не удалось: Endpoint Base URL отсутствует.",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "Убедитесь, что Base URL указывает на management API, реализующий GoNavi JVM HTTP contract, и проверьте прослушивание сервиса, port mapping и правила firewall.",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Подключение Endpoint не удалось: целевой management API не слушает порт или адрес недоступен.",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "Убедитесь, что источник клиента, настройки authentication и access policy разрешают GoNavi доступ к этому management API.",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Подключение Endpoint не удалось: целевой management API отклонил этот запрос.",
+ "jvm.backend.connection_error.endpoint.not_found.help": "Убедитесь, что Base URL указывает на корневой путь management API JVM, а не на бизнес-endpoint, health check или домашнюю страницу gateway.",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Подключение Endpoint не удалось: целевой адрес ответил, но management API GoNavi JVM не найден.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Измените Endpoint Base URL на адрес, начинающийся с http:// или https://.",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Подключение Endpoint не удалось: поддерживаются только HTTP или HTTPS.",
+ "jvm.backend.connection_error.endpoint.timeout.help": "Убедитесь, что Base URL доступен, целевой сервис запущен, и при необходимости увеличьте connection timeout.",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Подключение Endpoint не удалось: истекло время ожидания доступа к целевому management API.",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "Проверьте, совпадает ли Endpoint API Key в подключении с конфигурацией целевого сервиса.",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Подключение Endpoint не удалось: целевой management API ответил, но API Key отсутствует или недействителен.",
+ "jvm.backend.connection_error.generic": "Подключение JVM не удалось",
+ "jvm.backend.connection_error.jmx.auth.help": "Проверьте, отключена ли authentication у целевого JMX. Если authentication требуется, укажите username и password перед подключением.",
+ "jvm.backend.connection_error.jmx.auth.summary": "Подключение JMX не удалось: {{target}} требует authentication или текущие credentials недействительны.",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "Убедитесь, что на целевой JVM включен remote JMX, и проверьте host, firewall, port mapping, SSH и настройки proxy.",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "Подключение JMX не удалось: не удалось подключиться к {{target}}, потому что port не слушается или сеть недоступна.",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "Убедитесь, что настроенный port является открытым JMX port JVM, а не бизнес-портом, debug port или проксированным port.",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "Подключение JMX не удалось: сервис на {{target}} закрыл соединение; port не является совместимым стандартным JMX RMI port.",
+ "jvm.backend.connection_error.jmx.host_required": "Подключение JMX не удалось: host отсутствует.",
+ "jvm.backend.connection_error.jmx.java_missing.help": "Сначала установите JRE/JDK или укажите правильный исполняемый файл `java` через переменную окружения GONAVI_JMX_JAVA_BIN.",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "Подключение JMX не удалось: на текущей машине не найден runtime `java`, поэтому GoNavi не может запустить JMX helper.",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "Обычно это означает, что указан port RMI registry, debug port или другой port Java service. Проверьте настройки `jmxremote.port` и `jmxremote.rmi.port`.",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "Подключение JMX не удалось: на {{target}} есть RMI service, но это не пригодный JMX RMIServer port.",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "Используйте фактический JMX port, открытый приложением, а не бизнес `server.port`. Если сервис только включает `-Dcom.sun.management.jmxremote`, но не задает `jmxremote.port`, удаленное подключение невозможно.",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "Подключение JMX не удалось: {{target}} не является стандартным удаленным management port JMX; это похоже на бизнес-порт или HTTP port.",
+ "jvm.backend.connection_error.jmx.port_invalid": "Подключение JMX не удалось: port недействителен. Укажите допустимый port от 1 до 65535.",
+ "jvm.backend.connection_error.jmx.timeout.help": "Убедитесь, что port доступен, сеть не заблокирована, и при необходимости увеличьте connection timeout.",
+ "jvm.backend.connection_error.jmx.timeout.summary": "Подключение JMX не удалось: время ожидания подключения к {{target}} истекло.",
+ "jvm.backend.connection_error.suggestion": "Рекомендация: {{detail}}",
+ "jvm.backend.connection_error.technical_detail": "Технические сведения: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Адрес Arthas Tunnel недействителен: {{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Требуется адрес Arthas Tunnel",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "Активная command в этой Arthas Tunnel session не совпадает с command для отмены.",
+ "jvm.backend.diagnostic.arthas.command_already_running": "В этой Arthas Tunnel session уже выполняется command. Дождитесь завершения или сначала отмените ее.",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel command отменена",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel command завершилась по timeout за {{timeout}}",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "WebSocket-подключение Arthas Tunnel отменено",
+ "jvm.backend.diagnostic.arthas.connect_failed": "WebSocket-подключение Arthas Tunnel не удалось: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "WebSocket-подключение Arthas Tunnel не получило ответ за {{timeout}} и завершилось по timeout",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Подключение Arthas Tunnel закрыто: {{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Подключение Arthas Tunnel закрыто: code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Подключение Arthas Tunnel еще не готово. Повторите попытку позже.",
+ "jvm.backend.diagnostic.arthas.http_failed": "Подключение Arthas Tunnel не удалось: HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "В этой Arthas Tunnel session нет выполняющейся command.",
+ "jvm.backend.diagnostic.arthas.read_canceled": "Чтение вывода Arthas Tunnel отменено",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Не удалось задать read deadline Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "Не удалось прочитать вывод Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "Чтение вывода Arthas Tunnel не получило ответ за {{timeout}} и завершилось по timeout",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Не удалось закодировать запрос Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel поддерживает только адреса http/https/ws/wss: {{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "Отправка terminal command в Arthas Tunnel отменена",
+ "jvm.backend.diagnostic.arthas.send_failed": "Не удалось отправить terminal command в Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "Отправка terminal command в Arthas Tunnel не получила ответ за {{timeout}} и завершилась по timeout",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Конфигурация Arthas Tunnel session изменилась. Создайте diagnostic session заново.",
+ "jvm.backend.diagnostic.arthas.session_missing": "Diagnostic session не существует. Создайте Arthas Tunnel session заново.",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Требуется target ID для Arthas Tunnel (targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "Целевой instance не найден. Проверьте targetId / agentId и убедитесь, что tunnel client онлайн.",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Целевой instance {{target}} не найден. Проверьте targetId / agentId и убедитесь, что tunnel client онлайн.",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Не удалось закодировать terminal command Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Не удалось задать write deadline Arthas Tunnel: {{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "Не удалось записать diagnostic audit record, выполнение command заблокировано: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "Для cancel command требуются sessionId и commandId",
+ "jvm.backend.diagnostic.error.command_required": "Diagnostic command не может быть пустой",
+ "jvm.backend.diagnostic.error.disabled": "Для этого подключения не включен режим расширенной диагностики JVM",
+ "jvm.backend.diagnostic.error.execute_canceled": "Запрос выполнения диагностики отменен: {{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "Diagnostic session ID обязателен. Сначала создайте session.",
+ "jvm.backend.diagnostic.error.transport_unsupported": "Неподдерживаемый транспорт диагностики JVM: {{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas command отменена",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas command выполнена",
+ "jvm.backend.diagnostic.message.cancel_requested": "Cancel request отправлен; ожидание остановки command диагностическим bridge",
+ "jvm.backend.diagnostic.message.command_completed": "Diagnostic command выполнена",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnostic command не поддерживает переносы строк или несколько commands",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "High-risk diagnostic commands не включены для этого подключения: {{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe diagnostic commands не включены для этого подключения: {{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "Текущее подключение доступно только для чтения. Разрешены только observe diagnostic commands",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace diagnostic commands не включены для этого подключения: {{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "Не удалось записать audit record: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "Не удалось записать запись аудита, изменение JVM заблокировано: {{detail}}",
+ "jvm.backend.error.change_action_required": "Действие изменения JVM обязательно",
+ "jvm.backend.error.change_blocked_by_guard": "Текущее изменение заблокировано Guard",
+ "jvm.backend.error.change_blocked_read_only": "Текущее подключение доступно только для чтения, поэтому запись заблокирована",
+ "jvm.backend.error.change_confirmation_token_failed": "Не удалось создать токен подтверждения изменения JVM: {{detail}}",
+ "jvm.backend.error.change_reason_required": "Причина изменения JVM обязательна",
+ "jvm.backend.error.change_resource_id_required": "ID ресурса JVM обязателен",
+ "jvm.backend.error.confirmation_token_expired": "Срок действия токена подтверждения истек. Выполните предварительный просмотр и подтвердите снова.",
+ "jvm.backend.error.confirmation_token_invalid": "Токен подтверждения недействителен. Выполните предварительный просмотр и подтвердите снова.",
+ "jvm.backend.error.confirmation_token_missing": "Токен подтверждения отсутствует. Сначала завершите подтверждение предварительного просмотра.",
+ "jvm.backend.error.disallowed_mode": "Текущее подключение не разрешает режим {{mode}}",
+ "jvm.backend.error.preview_confirmation_missing": "Токен подтверждения предварительного просмотра отсутствует. Перед отправкой выполните предварительный просмотр еще раз.",
+ "jvm.backend.error.preview_context_hash_failed": "Не удалось создать контекст предварительного просмотра JVM: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "Не удалось создать digest Payload предварительного просмотра JVM: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "Недопустимый путь ресурса JVM: {{detail}}",
+ "jvm.backend.message.connect_success": "Подключение JVM успешно выполнено",
+ "jvm.backend.monitoring.error.session_not_found": "Сеанс мониторинга JVM для {{connectionId}} {{providerMode}} не найден",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "Снимок мониторинга {{provider}} пока не поддерживается",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "Сбор данных мониторинга завершился с ошибкой {{count}} раз подряд, поэтому этот сеанс был автоматически остановлен",
+ "jvm.backend.separator.message_warning": "; ",
+ "jvm.backend.warning.failed_audit_write_failed": "Не удалось записать аудит сбоя: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "Не удалось записать финальный аудит: {{detail}}",
"jvm_ai_plan.actions.description": ": {{description}}",
"jvm_ai_plan.actions.field_separator": ", ",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "Диагностический AI-план: {{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "Диагностический transport в AI-плане: {{planTransport}}, он не совпадает с текущей консолью {{currentTransport}}. Перед применением создайте план заново.",
"jvm_diagnostic.ai_plan.message.filled": "Диагностический AI-план перенесен в консоль",
+ "jvm_diagnostic.capability.empty.description": "Проверка возможностей только считывает права канала и политику команд. Она не создает сеанс и не выполняет команды.",
+ "jvm_diagnostic.capability.empty.title": "Возможности еще не проверены",
"jvm_diagnostic.capability_result.mutating_allowed": "Команды высокого риска",
"jvm_diagnostic.capability_result.observe_allowed": "Команды Observe",
"jvm_diagnostic.capability_result.observe_denied": "Observe запрещен",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "Потоковая передача не поддерживается",
"jvm_diagnostic.capability_result.title": "Результаты проверки возможностей",
"jvm_diagnostic.capability_result.trace_allowed": "Команды Trace",
- "jvm_diagnostic.capability.empty.description": "Проверка возможностей только считывает права канала и политику команд. Она не создает сеанс и не выполняет команды.",
- "jvm_diagnostic.capability.empty.title": "Возможности еще не проверены",
"jvm_diagnostic.command_input.command_description": "Введите команду Arthas/диагностики, например thread -n 5, dashboard или jvm; шаблоны ниже заполняют ее одним щелчком.",
"jvm_diagnostic.command_input.command_label": "Диагностическая команда",
"jvm_diagnostic.command_input.description": "Поддерживает автодополнение. Нажмите Ctrl/Cmd + Enter для запуска.",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "Ручной ввод",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "Сеанс запущен из консоли",
+ "jvm_diagnostic.session.default_title": "Консоль диагностики JVM",
"jvm_diagnostic.session_capability.action.clear_output": "Очистить вывод",
"jvm_diagnostic.session_capability.action.refresh_history": "Обновить историю",
"jvm_diagnostic.session_capability.description": "Текущий канал, права и быстрое обслуживание",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "Нет сеанса",
"jvm_diagnostic.session_capability.status.session_established": "Сеанс установлен",
"jvm_diagnostic.session_capability.title": "Сеанс и возможности",
- "jvm_diagnostic.session.default_reason": "Сеанс запущен из консоли",
- "jvm_diagnostic.session.default_title": "Консоль диагностики JVM",
"jvm_diagnostic.workbench.action.cancel_command": "Отменить команду",
"jvm_diagnostic.workbench.action.execute_command": "Выполнить команду",
"jvm_diagnostic.workbench.action.probe": "Проверить возможности",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "Значение ресурса",
"jvm_resource.section.supported_actions": "Поддерживаемые действия ресурса",
"jvm_resource.title": "Рабочая область ресурсов JVM",
- "jvm.backend.capability.reason.read_only": "Текущее подключение доступно только для чтения",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "Укажите полный URL http:// или https://, например http://127.0.0.1:19090/gonavi/agent/jvm.",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Подключение Agent не удалось: Agent Base URL недействителен.",
- "jvm.backend.connection_error.agent.base_url_required": "Подключение Agent не удалось: Agent Base URL отсутствует.",
- "jvm.backend.connection_error.agent.connection_refused.help": "Убедитесь, что Java service запущен с GoNavi Agent через `-javaagent`, и проверьте Base URL, port mapping и правила firewall.",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Подключение Agent не удалось: целевой management port Agent не слушается или адрес недоступен.",
- "jvm.backend.connection_error.agent.forbidden.help": "Убедитесь, что источник клиента, настройки authentication и access policy Agent разрешают GoNavi доступ.",
- "jvm.backend.connection_error.agent.forbidden.summary": "Подключение Agent не удалось: Agent отклонил этот запрос.",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "Измените Agent Base URL на адрес, начинающийся с http:// или https://.",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Подключение Agent не удалось: поддерживаются только HTTP или HTTPS.",
- "jvm.backend.connection_error.agent.timeout.help": "Убедитесь, что целевой адрес доступен, Agent запущен, и при необходимости увеличьте connection timeout.",
- "jvm.backend.connection_error.agent.timeout.summary": "Подключение Agent не удалось: истекло время ожидания доступа к management port Agent.",
- "jvm.backend.connection_error.agent.unauthorized.help": "Проверьте, совпадает ли Agent API Key в подключении с параметрами запуска целевого сервиса.",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Подключение Agent не удалось: Agent ответил, но API Key отсутствует или недействителен.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "Укажите полный URL http:// или https://, который указывает на корневой путь management API, реализующего GoNavi JVM HTTP contract, например http://127.0.0.1:19090/manage/jvm.",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Подключение Endpoint не удалось: Endpoint Base URL недействителен.",
- "jvm.backend.connection_error.endpoint.base_url_required": "Подключение Endpoint не удалось: Endpoint Base URL отсутствует.",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "Убедитесь, что Base URL указывает на management API, реализующий GoNavi JVM HTTP contract, и проверьте прослушивание сервиса, port mapping и правила firewall.",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Подключение Endpoint не удалось: целевой management API не слушает порт или адрес недоступен.",
- "jvm.backend.connection_error.endpoint.forbidden.help": "Убедитесь, что источник клиента, настройки authentication и access policy разрешают GoNavi доступ к этому management API.",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Подключение Endpoint не удалось: целевой management API отклонил этот запрос.",
- "jvm.backend.connection_error.endpoint.not_found.help": "Убедитесь, что Base URL указывает на корневой путь management API JVM, а не на бизнес-endpoint, health check или домашнюю страницу gateway.",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Подключение Endpoint не удалось: целевой адрес ответил, но management API GoNavi JVM не найден.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "Измените Endpoint Base URL на адрес, начинающийся с http:// или https://.",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Подключение Endpoint не удалось: поддерживаются только HTTP или HTTPS.",
- "jvm.backend.connection_error.endpoint.timeout.help": "Убедитесь, что Base URL доступен, целевой сервис запущен, и при необходимости увеличьте connection timeout.",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Подключение Endpoint не удалось: истекло время ожидания доступа к целевому management API.",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "Проверьте, совпадает ли Endpoint API Key в подключении с конфигурацией целевого сервиса.",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Подключение Endpoint не удалось: целевой management API ответил, но API Key отсутствует или недействителен.",
- "jvm.backend.connection_error.generic": "Подключение JVM не удалось",
- "jvm.backend.connection_error.jmx.auth.help": "Проверьте, отключена ли authentication у целевого JMX. Если authentication требуется, укажите username и password перед подключением.",
- "jvm.backend.connection_error.jmx.auth.summary": "Подключение JMX не удалось: {{target}} требует authentication или текущие credentials недействительны.",
- "jvm.backend.connection_error.jmx.connection_refused.help": "Убедитесь, что на целевой JVM включен remote JMX, и проверьте host, firewall, port mapping, SSH и настройки proxy.",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "Подключение JMX не удалось: не удалось подключиться к {{target}}, потому что port не слушается или сеть недоступна.",
- "jvm.backend.connection_error.jmx.connection_reset.help": "Убедитесь, что настроенный port является открытым JMX port JVM, а не бизнес-портом, debug port или проксированным port.",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "Подключение JMX не удалось: сервис на {{target}} закрыл соединение; port не является совместимым стандартным JMX RMI port.",
- "jvm.backend.connection_error.jmx.host_required": "Подключение JMX не удалось: host отсутствует.",
- "jvm.backend.connection_error.jmx.java_missing.help": "Сначала установите JRE/JDK или укажите правильный исполняемый файл `java` через переменную окружения GONAVI_JMX_JAVA_BIN.",
- "jvm.backend.connection_error.jmx.java_missing.summary": "Подключение JMX не удалось: на текущей машине не найден runtime `java`, поэтому GoNavi не может запустить JMX helper.",
- "jvm.backend.connection_error.jmx.no_such_object.help": "Обычно это означает, что указан port RMI registry, debug port или другой port Java service. Проверьте настройки `jmxremote.port` и `jmxremote.rmi.port`.",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "Подключение JMX не удалось: на {{target}} есть RMI service, но это не пригодный JMX RMIServer port.",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "Используйте фактический JMX port, открытый приложением, а не бизнес `server.port`. Если сервис только включает `-Dcom.sun.management.jmxremote`, но не задает `jmxremote.port`, удаленное подключение невозможно.",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "Подключение JMX не удалось: {{target}} не является стандартным удаленным management port JMX; это похоже на бизнес-порт или HTTP port.",
- "jvm.backend.connection_error.jmx.port_invalid": "Подключение JMX не удалось: port недействителен. Укажите допустимый port от 1 до 65535.",
- "jvm.backend.connection_error.jmx.timeout.help": "Убедитесь, что port доступен, сеть не заблокирована, и при необходимости увеличьте connection timeout.",
- "jvm.backend.connection_error.jmx.timeout.summary": "Подключение JMX не удалось: время ожидания подключения к {{target}} истекло.",
- "jvm.backend.connection_error.suggestion": "Рекомендация: {{detail}}",
- "jvm.backend.connection_error.technical_detail": "Технические сведения: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Адрес Arthas Tunnel недействителен: {{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Требуется адрес Arthas Tunnel",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "Активная command в этой Arthas Tunnel session не совпадает с command для отмены.",
- "jvm.backend.diagnostic.arthas.command_already_running": "В этой Arthas Tunnel session уже выполняется command. Дождитесь завершения или сначала отмените ее.",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel command отменена",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel command завершилась по timeout за {{timeout}}",
- "jvm.backend.diagnostic.arthas.connect_canceled": "WebSocket-подключение Arthas Tunnel отменено",
- "jvm.backend.diagnostic.arthas.connect_failed": "WebSocket-подключение Arthas Tunnel не удалось: {{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "WebSocket-подключение Arthas Tunnel не получило ответ за {{timeout}} и завершилось по timeout",
- "jvm.backend.diagnostic.arthas.connection_closed": "Подключение Arthas Tunnel закрыто: {{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Подключение Arthas Tunnel закрыто: code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Подключение Arthas Tunnel еще не готово. Повторите попытку позже.",
- "jvm.backend.diagnostic.arthas.http_failed": "Подключение Arthas Tunnel не удалось: HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "В этой Arthas Tunnel session нет выполняющейся command.",
- "jvm.backend.diagnostic.arthas.read_canceled": "Чтение вывода Arthas Tunnel отменено",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Не удалось задать read deadline Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "Не удалось прочитать вывод Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "Чтение вывода Arthas Tunnel не получило ответ за {{timeout}} и завершилось по timeout",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Не удалось закодировать запрос Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel поддерживает только адреса http/https/ws/wss: {{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "Отправка terminal command в Arthas Tunnel отменена",
- "jvm.backend.diagnostic.arthas.send_failed": "Не удалось отправить terminal command в Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "Отправка terminal command в Arthas Tunnel не получила ответ за {{timeout}} и завершилась по timeout",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Конфигурация Arthas Tunnel session изменилась. Создайте diagnostic session заново.",
- "jvm.backend.diagnostic.arthas.session_missing": "Diagnostic session не существует. Создайте Arthas Tunnel session заново.",
- "jvm.backend.diagnostic.arthas.target_id_required": "Требуется target ID для Arthas Tunnel (targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "Целевой instance не найден. Проверьте targetId / agentId и убедитесь, что tunnel client онлайн.",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "Целевой instance {{target}} не найден. Проверьте targetId / agentId и убедитесь, что tunnel client онлайн.",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Не удалось закодировать terminal command Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Не удалось задать write deadline Arthas Tunnel: {{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "Не удалось записать diagnostic audit record, выполнение command заблокировано: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "Для cancel command требуются sessionId и commandId",
- "jvm.backend.diagnostic.error.command_required": "Diagnostic command не может быть пустой",
- "jvm.backend.diagnostic.error.disabled": "Для этого подключения не включен режим расширенной диагностики JVM",
- "jvm.backend.diagnostic.error.execute_canceled": "Запрос выполнения диагностики отменен: {{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "Diagnostic session ID обязателен. Сначала создайте session.",
- "jvm.backend.diagnostic.error.transport_unsupported": "Неподдерживаемый транспорт диагностики JVM: {{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas command отменена",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas command выполнена",
- "jvm.backend.diagnostic.message.cancel_requested": "Cancel request отправлен; ожидание остановки command диагностическим bridge",
- "jvm.backend.diagnostic.message.command_completed": "Diagnostic command выполнена",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "Diagnostic command не поддерживает переносы строк или несколько commands",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "High-risk diagnostic commands не включены для этого подключения: {{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "Observe diagnostic commands не включены для этого подключения: {{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "Текущее подключение доступно только для чтения. Разрешены только observe diagnostic commands",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "Trace diagnostic commands не включены для этого подключения: {{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "Не удалось записать audit record: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "Не удалось записать запись аудита, изменение JVM заблокировано: {{detail}}",
- "jvm.backend.error.change_action_required": "Действие изменения JVM обязательно",
- "jvm.backend.error.change_blocked_by_guard": "Текущее изменение заблокировано Guard",
- "jvm.backend.error.change_blocked_read_only": "Текущее подключение доступно только для чтения, поэтому запись заблокирована",
- "jvm.backend.error.change_confirmation_token_failed": "Не удалось создать токен подтверждения изменения JVM: {{detail}}",
- "jvm.backend.error.change_reason_required": "Причина изменения JVM обязательна",
- "jvm.backend.error.change_resource_id_required": "ID ресурса JVM обязателен",
- "jvm.backend.error.confirmation_token_expired": "Срок действия токена подтверждения истек. Выполните предварительный просмотр и подтвердите снова.",
- "jvm.backend.error.confirmation_token_invalid": "Токен подтверждения недействителен. Выполните предварительный просмотр и подтвердите снова.",
- "jvm.backend.error.confirmation_token_missing": "Токен подтверждения отсутствует. Сначала завершите подтверждение предварительного просмотра.",
- "jvm.backend.error.disallowed_mode": "Текущее подключение не разрешает режим {{mode}}",
- "jvm.backend.error.preview_confirmation_missing": "Токен подтверждения предварительного просмотра отсутствует. Перед отправкой выполните предварительный просмотр еще раз.",
- "jvm.backend.error.preview_context_hash_failed": "Не удалось создать контекст предварительного просмотра JVM: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "Не удалось создать digest Payload предварительного просмотра JVM: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "Недопустимый путь ресурса JVM: {{detail}}",
- "jvm.backend.message.connect_success": "Подключение JVM успешно выполнено",
- "jvm.backend.monitoring.error.session_not_found": "Сеанс мониторинга JVM для {{connectionId}} {{providerMode}} не найден",
- "jvm.backend.monitoring.error.snapshot_unsupported": "Снимок мониторинга {{provider}} пока не поддерживается",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "Сбор данных мониторинга завершился с ошибкой {{count}} раз подряд, поэтому этот сеанс был автоматически остановлен",
- "jvm.backend.separator.message_warning": "; ",
- "jvm.backend.warning.failed_audit_write_failed": "Не удалось записать аудит сбоя: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "Не удалось записать финальный аудит: {{detail}}",
"log_panel.action.clear": "Очистить журнал",
"log_panel.action.close": "Закрыть панель",
"log_panel.affected_rows": "Затронуто строк: {{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "Нет журналов выполнения SQL",
"log_panel.short_title": "Логи",
"log_panel.title": "Журнал выполнения SQL",
- "message_publish_modal.action.send": "Отправить",
- "message_publish_modal.error.build_command_failed": "Не удалось создать команду отправки",
- "message_publish_modal.error.send_failed_detail": "Отправка не удалась: {{detail}}",
- "message_publish_modal.error.unknown_error": "Неизвестная ошибка",
- "message_publish_modal.field.body_mode.label": "Тип тела сообщения",
- "message_publish_modal.field.body.extra": "В режиме JSON требуется корректный JSON. В текстовом режиме содержимое отправляется как есть.",
- "message_publish_modal.field.body.label": "Тело сообщения",
- "message_publish_modal.field.body.placeholder": "Введите тело сообщения",
- "message_publish_modal.field.body.required": "Введите тело сообщения",
- "message_publish_modal.field.delay_level.extra": "RocketMQ использует фиксированные уровни задержки. 0 означает немедленную отправку.",
- "message_publish_modal.field.delay_level.label": "Delay Level (необязательно)",
- "message_publish_modal.field.exchange.extra": "Оставьте пустым, чтобы использовать exchange по умолчанию. Если указан пользовательский exchange, убедитесь, что для целевой Queue создан binding.",
- "message_publish_modal.field.exchange.label": "Exchange (необязательно)",
- "message_publish_modal.field.exchange.placeholder": "Пример: events.topic",
- "message_publish_modal.field.headers.extra": "Должно быть JSON-объектом, например {{example}}.",
- "message_publish_modal.field.headers.label": "Headers (необязательно)",
- "message_publish_modal.field.properties.extra": "Должно быть JSON-объектом, например {{example}}.",
- "message_publish_modal.field.properties.label": "Properties (необязательно)",
- "message_publish_modal.field.qos.extra": "0 означает at most once, 1 означает at least once, 2 означает exactly once.",
- "message_publish_modal.field.retain.label": "Retain-сообщение",
- "message_publish_modal.field.routing_key.extra": "Оставьте пустым, чтобы по умолчанию использовать имя текущей Queue.",
- "message_publish_modal.field.routing_key.label": "Routing Key (необязательно)",
- "message_publish_modal.field.routing_key.placeholder": "Пример: orders.queue",
- "message_publish_modal.field.tag.extra": "Оставьте пустым, чтобы не фильтровать и не записывать Tag.",
- "message_publish_modal.field.tag.label": "Tag (необязательно)",
- "message_publish_modal.footer.success_prefix": "При успешной отправке возвращается",
- "message_publish_modal.footer.success_suffix": ", чтобы подтвердить, было ли отправлено это тестовое сообщение.",
- "message_publish_modal.option.no_delay": "Без задержки",
- "message_publish_modal.option.text": "Текст",
- "message_publish_modal.title": "Тестовая отправка сообщения",
- "message_publish_modal.title_with_connection": "Тестовая отправка сообщения · {{connectionName}}",
"message_publish.error.destination_required": "Введите целевой Topic / Queue",
"message_publish.error.invalid_json_detail": "{{field}} не является корректным JSON: {{detail}}",
"message_publish.error.json_object_required": "{{field}} должен быть JSON-объектом",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag, Keys, Delay Level и Properties записываются в атрибуты сообщения RocketMQ.",
"message_publish.presentation.rocketmq.tag_placeholder": "Пример: TagA",
"message_publish.presentation.topic_required": "Введите Topic",
+ "message_publish_modal.action.send": "Отправить",
+ "message_publish_modal.error.build_command_failed": "Не удалось создать команду отправки",
+ "message_publish_modal.error.send_failed_detail": "Отправка не удалась: {{detail}}",
+ "message_publish_modal.error.unknown_error": "Неизвестная ошибка",
+ "message_publish_modal.field.body.extra": "В режиме JSON требуется корректный JSON. В текстовом режиме содержимое отправляется как есть.",
+ "message_publish_modal.field.body.label": "Тело сообщения",
+ "message_publish_modal.field.body.placeholder": "Введите тело сообщения",
+ "message_publish_modal.field.body.required": "Введите тело сообщения",
+ "message_publish_modal.field.body_mode.label": "Тип тела сообщения",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ использует фиксированные уровни задержки. 0 означает немедленную отправку.",
+ "message_publish_modal.field.delay_level.label": "Delay Level (необязательно)",
+ "message_publish_modal.field.exchange.extra": "Оставьте пустым, чтобы использовать exchange по умолчанию. Если указан пользовательский exchange, убедитесь, что для целевой Queue создан binding.",
+ "message_publish_modal.field.exchange.label": "Exchange (необязательно)",
+ "message_publish_modal.field.exchange.placeholder": "Пример: events.topic",
+ "message_publish_modal.field.headers.extra": "Должно быть JSON-объектом, например {{example}}.",
+ "message_publish_modal.field.headers.label": "Headers (необязательно)",
+ "message_publish_modal.field.properties.extra": "Должно быть JSON-объектом, например {{example}}.",
+ "message_publish_modal.field.properties.label": "Properties (необязательно)",
+ "message_publish_modal.field.qos.extra": "0 означает at most once, 1 означает at least once, 2 означает exactly once.",
+ "message_publish_modal.field.retain.label": "Retain-сообщение",
+ "message_publish_modal.field.routing_key.extra": "Оставьте пустым, чтобы по умолчанию использовать имя текущей Queue.",
+ "message_publish_modal.field.routing_key.label": "Routing Key (необязательно)",
+ "message_publish_modal.field.routing_key.placeholder": "Пример: orders.queue",
+ "message_publish_modal.field.tag.extra": "Оставьте пустым, чтобы не фильтровать и не записывать Tag.",
+ "message_publish_modal.field.tag.label": "Tag (необязательно)",
+ "message_publish_modal.footer.success_prefix": "При успешной отправке возвращается",
+ "message_publish_modal.footer.success_suffix": ", чтобы подтвердить, было ли отправлено это тестовое сообщение.",
+ "message_publish_modal.option.no_delay": "Без задержки",
+ "message_publish_modal.option.text": "Текст",
+ "message_publish_modal.title": "Тестовая отправка сообщения",
+ "message_publish_modal.title_with_connection": "Тестовая отправка сообщения · {{connectionName}}",
"proxy.backend.error.host_empty": "Хост прокси пуст",
"proxy.backend.error.http_connect_failed": "Не удалось подключиться к HTTP-прокси: {{detail}}",
"proxy.backend.error.http_connect_read_failed": "Не удалось прочитать ответ HTTP CONNECT: {{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "Не удалось подключиться через SOCKS5-прокси: {{detail}}",
"proxy.backend.error.socks5_dialer_failed": "Не удалось создать dialer для SOCKS5-прокси: {{detail}}",
"proxy.backend.error.unsupported_type": "Неподдерживаемый тип прокси: {{type}}",
+ "query.format": "Форматировать SQL",
+ "query.new": "Новый запрос",
+ "query.run": "Выполнить",
+ "query.save": "Сохранить запрос",
+ "query.stop": "Остановить",
"query_editor.action.ai_explain_sql": "AI: объяснить SQL",
"query_editor.action.ai_explain_sql_menu": "Объяснить SQL",
"query_editor.action.ai_generate_sql": "AI: сгенерировать SQL",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "Анализ схемы",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "Экспортировать SQL-файл",
- "query_editor.action.format": "Форматировать",
"query_editor.action.find_in_editor": "Поиск",
"query_editor.action.find_in_editor_with_shortcut": "Поиск в редакторе ({{shortcut}})",
+ "query_editor.action.format": "Форматировать",
"query_editor.action.format_sql": "Форматировать SQL",
"query_editor.action.format_sql_with_shortcut": "Форматировать SQL ({{shortcut}})",
"query_editor.action.hide_results_panel": "Скрыть область результатов",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "Макс. строк: 5000",
"query_editor.max_rows.option_unlimited": "Макс. строк: без ограничения",
"query_editor.max_rows.tooltip": "Максимальное число возвращаемых строк. Для SELECT автоматически добавляется LIMIT, чтобы большие результаты не блокировали интерфейс.",
+ "query_editor.message.ai_model_missing": "Для активного AI Provider не выбрана модель. Сначала выберите модель в настройках AI.",
+ "query_editor.message.ai_provider_missing": "Сначала настройте и включите AI Provider в настройках AI.",
+ "query_editor.message.ai_service_unavailable": "AI-сервис ещё не готов. Повторите попытку позже или проверьте настройки AI.",
"query_editor.message.append_success": "Код добавлен.",
"query_editor.message.cancel_failed": "Не удалось отменить запрос: {{error}}",
"query_editor.message.cancel_no_running": "Нет выполняющегося запроса для отмены.",
"query_editor.message.cancel_success": "Запрос отменен.",
"query_editor.message.connection_not_found": "Подключение не найдено.",
"query_editor.message.connection_readonly_blocked": "Для этого подключения включена защита production, разрешены только операции запроса.",
+ "query_editor.message.current_line_no_copyable_content": "В текущей строке нет содержимого для копирования.",
"query_editor.message.execution_failed_with_error": "Ошибка выполнения запроса: {{error}}",
"query_editor.message.execution_multi_success": "Выполнено инструкций: {{statements}}, создано наборов результатов: {{results}}.",
"query_editor.message.execution_result_sets_success": "Выполнение завершено, создано наборов результатов: {{results}}.",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "Ошибка форматирования: возможно, синтаксис SQL неверен.",
"query_editor.message.format_restore_success": "Восстановлено состояние SQL до форматирования.",
"query_editor.message.insert_success": "Код вставлен в текущую позицию курсора.",
- "query_editor.message.ai_model_missing": "Для активного AI Provider не выбрана модель. Сначала выберите модель в настройках AI.",
- "query_editor.message.ai_provider_missing": "Сначала настройте и включите AI Provider в настройках AI.",
- "query_editor.message.ai_service_unavailable": "AI-сервис ещё не готов. Повторите попытку позже или проверьте настройки AI.",
"query_editor.message.no_executable_sql": "Нет SQL для выполнения.",
"query_editor.message.no_format_restore_snapshot": "Нет сохранённого состояния SQL до форматирования для восстановления.",
- "query_editor.message.current_line_no_copyable_content": "В текущей строке нет содержимого для копирования.",
"query_editor.message.no_selectable_sql": "Нет SQL-инструкции для выбора.",
"query_editor.message.object_info_target_not_found": "Текущий курсор не указывает на распознанную таблицу или колонку.",
"query_editor.message.page_query_empty": "Запрос страницы не вернул набор результатов.",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "Результат {{index}} ✓",
"query_editor.results_panel.action.hide": "Скрыть",
"query_editor.results_panel.aria.hide": "Скрыть область результатов",
+ "query_editor.results_panel.detached.close": "Закрыть окно",
+ "query_editor.results_panel.detached.restore": "Вернуть как вкладку результата",
+ "query_editor.results_panel.detached.title": "Результат {{index}}",
"query_editor.results_panel.menu.close_all": "Закрыть все вкладки",
"query_editor.results_panel.menu.close_left": "Закрыть вкладки слева",
"query_editor.results_panel.menu.close_other": "Закрыть другие вкладки",
"query_editor.results_panel.menu.close_right": "Закрыть вкладки справа",
+ "query_editor.results_panel.menu.open_in_window": "Открыть в плавающем окне",
+ "query_editor.results_panel.menu.restore_to_tab": "Вернуть как вкладку результата",
"query_editor.results_panel.message.action.copy": "Копировать",
"query_editor.results_panel.message.copy_failed": "Не удалось скопировать сообщение: {{detail}}",
"query_editor.results_panel.message.copy_unsupported": "Буфер обмена недоступен в текущей среде",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "Переименовать запрос",
"query_editor.save_modal.title": "Сохранить запрос",
"query_editor.save_modal.unnamed": "Запрос без имени",
- "query_editor.snippet_picker.description": "Выберите существующий SQL-сниппет и вставьте его в текущую позицию курсора.",
- "query_editor.snippet_picker.empty": "Доступных SQL-сниппетов пока нет. Откройте настройки сниппетов, чтобы добавить их или восстановить значения по умолчанию.",
- "query_editor.snippet_picker.empty_filtered": "Нет SQL-сниппетов, соответствующих текущему фильтру.",
- "query_editor.snippet_picker.manage": "Управление сниппетами",
- "query_editor.snippet_picker.search_placeholder": "Поиск по префиксу, имени или содержимому",
- "query_editor.snippet_picker.title": "Вставить SQL-сниппет",
"query_editor.slash_command.diff.description": "Сравнить различия таблиц и создать изменения",
"query_editor.slash_command.diff.label": "Сравнение таблиц",
"query_editor.slash_command.diff.prompt": "Сравни структуры двух таблиц и сгенерируй ALTER-инструкции для миграции со старой версии на новую.",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "Описать требование и сгенерировать инструкцию",
"query_editor.slash_command.sql.label": "Сгенерировать SQL",
"query_editor.slash_command.sql.prompt": "Сгенерируй SQL для этого требования:",
- "query_editor.text_to_sql.description": "Опишите данные, которые нужно запросить или изменить. GoNavi использует текущее подключение, базу данных и загруженную схему для генерации SQL.",
- "query_editor.text_to_sql.generate": "Сгенерировать SQL",
- "query_editor.text_to_sql.mode.insert": "Вставить в курсор",
- "query_editor.text_to_sql.mode.replace_all": "Заменить всё",
- "query_editor.text_to_sql.mode.replace_selection": "Заменить выделение",
- "query_editor.text_to_sql.placeholder": "Например: посчитать дневную сумму заказов за последние 30 дней и отсортировать по дате по возрастанию",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "Выберите существующий SQL-сниппет и вставьте его в текущую позицию курсора.",
+ "query_editor.snippet_picker.empty": "Доступных SQL-сниппетов пока нет. Откройте настройки сниппетов, чтобы добавить их или восстановить значения по умолчанию.",
+ "query_editor.snippet_picker.empty_filtered": "Нет SQL-сниппетов, соответствующих текущему фильтру.",
+ "query_editor.snippet_picker.manage": "Управление сниппетами",
+ "query_editor.snippet_picker.search_placeholder": "Поиск по префиксу, имени или содержимому",
+ "query_editor.snippet_picker.title": "Вставить SQL-сниппет",
"query_editor.sql_error.rule.column_missing.explanation": "SQL ссылается на столбец, которого нет в наборе результатов, имя отличается по написанию или столбца нет в текущей таблице.",
"query_editor.sql_error.rule.column_missing.label": "Столбец не существует",
"query_editor.sql_error.rule.column_missing.suggestion": "Проверьте имена столбцов, алиасы, регистр, алиасы таблиц и принадлежность столбца текущему объекту FROM/JOIN.",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "Исходная ошибка: {{error}}",
"query_editor.sql_error.wrapper.semantic_line": "Смысл: {{label}}. {{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "Рекомендация: {{suggestion}}",
+ "query_editor.text_to_sql.description": "Опишите данные, которые нужно запросить или изменить. GoNavi использует текущее подключение, базу данных и загруженную схему для генерации SQL.",
+ "query_editor.text_to_sql.generate": "Сгенерировать SQL",
+ "query_editor.text_to_sql.mode.insert": "Вставить в курсор",
+ "query_editor.text_to_sql.mode.replace_all": "Заменить всё",
+ "query_editor.text_to_sql.mode.replace_selection": "Заменить выделение",
+ "query_editor.text_to_sql.placeholder": "Например: посчитать дневную сумму заказов за последние 30 дней и отсортировать по дате по возрастанию",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "Commit",
"query_editor.transaction.action.commit_with_count": "Commit ({{count}})",
"query_editor.transaction.action.rollback": "Rollback",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "Не удалось разобрать отпечаток подключения",
"query_history.backend.message.cleared": "История медленных запросов очищена",
"query_history.backend.message.loaded": "Загрузка завершена",
- "query.format": "Форматировать SQL",
- "query.new": "Новый запрос",
- "query.run": "Выполнить",
- "query.save": "Сохранить запрос",
- "query.stop": "Остановить",
+ "redis.backend.error.address_required": "Адрес подключения Redis не может быть пустым",
+ "redis.backend.error.argument_invalid_type": "{{name}} имеет недопустимый тип",
+ "redis.backend.error.argument_required": "{{name}} обязателен",
+ "redis.backend.error.cluster_connect_failed": "Не удалось подключиться к Redis Cluster: {{detail}}",
+ "redis.backend.error.command_required": "Command не может быть пустым",
+ "redis.backend.error.connect_attempt_failed": "Попытка подключения {{attempt}} завершилась ошибкой: {{detail}}",
+ "redis.backend.error.connect_failed": "Не удалось подключиться к Redis: {{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "Сбой настройки TLS на попытке {{attempt}}: {{detail}}",
+ "redis.backend.error.export_no_keys": "Нет Key для экспорта",
+ "redis.backend.error.import_no_keys_selected": "Не выбраны Keys для импорта",
+ "redis.backend.error.import_payload_invalid": "Файл импорта Redis недействителен: {{detail}}",
+ "redis.backend.error.invalid_node_address": "Недопустимый адрес узла Redis: {{address}}",
+ "redis.backend.error.invalid_port": "Недопустимый порт Redis: {{address}}",
+ "redis.backend.error.node_address_required": "Адрес узла Redis не может быть пустым",
+ "redis.backend.error.select_db_index_invalid": "Недопустимый индекс базы данных: {{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "Индекс базы данных должен быть в диапазоне от {{min}} до {{max}}",
+ "redis.backend.error.select_db_index_required": "Для команды SELECT требуется индекс базы данных",
+ "redis.backend.error.sentinel_connect_failed": "Не удалось подключиться к Redis Sentinel: {{detail}}",
+ "redis.backend.error.sentinel_master_required": "Для режима Redis Sentinel требуется имя master",
+ "redis.backend.error.ssh_tunnel_create_failed": "Не удалось создать SSH-туннель: {{detail}}",
+ "redis.backend.error.test_connection_close_failed": "Подключение выполнено, но не удалось закрыть тестовое подключение: {{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Режим Redis {{topology}} пока не поддерживает SSH-туннели. Отключите SSH и повторите попытку.",
+ "redis.backend.label.topology_cluster": "кластер",
+ "redis.backend.label.topology_multi_node": "многоузловой",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "Добавление выполнено",
+ "redis.backend.message.connect_success": "Подключение выполнено",
+ "redis.backend.message.delete_success": "Удаление выполнено",
+ "redis.backend.message.export_success": "Экспорт выполнен",
+ "redis.backend.message.flush_success": "Очистка выполнена",
+ "redis.backend.message.import_success": "Импорт выполнен",
+ "redis.backend.message.rename_success": "Переименование выполнено",
+ "redis.backend.message.select_db_success": "База данных переключена",
+ "redis.backend.message.set_success": "Значение задано",
+ "redis.db_alias.menu.set": "Задать псевдоним",
+ "redis.db_alias.modal.placeholder": "напр. cache, sessions (оставьте пустым для сброса)",
+ "redis.db_alias.modal.title": "Псевдоним для {{db}}",
"redis_command.action.clear_console": "Очистить консоль",
"redis_command.action.execute": "Выполнить (Cmd+Enter)",
"redis_command.completion.detail": "Команда Redis",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "Добавить в конец",
"redis_viewer.action.add_member": "Добавить участника",
"redis_viewer.action.add_stream_entry": "Добавить запись",
+ "redis_viewer.action.change_import_file": "Изменить файл импорта",
"redis_viewer.action.clear_group_selection": "Снять выбор",
"redis_viewer.action.clear_selection": "Снять выбор",
"redis_viewer.action.copy": "Копировать",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "Редактировать",
"redis_viewer.action.export_all": "Экспортировать все",
"redis_viewer.action.export_selected": "Экспортировать выбранное",
- "redis_viewer.action.change_import_file": "Изменить файл импорта",
"redis_viewer.action.import": "Импортировать",
"redis_viewer.action.load_all": "Загрузить все",
"redis_viewer.action.load_more": "Загрузить еще",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "Обновить",
"redis_viewer.action.rename_key": "Переименовать Key",
"redis_viewer.action.select_all_import_keys": "Выбрать все Key для импорта",
- "redis_viewer.action.select_import_file": "Выбрать файл импорта",
"redis_viewer.action.select_all_loaded": "Выбрать все загруженные",
"redis_viewer.action.select_group": "Выбрать",
+ "redis_viewer.action.select_import_file": "Выбрать файл импорта",
"redis_viewer.action.set_ttl": "Задать TTL",
"redis_viewer.aria.collapse_group": "Свернуть группу",
"redis_viewer.aria.expand_group": "Развернуть группу",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "Двоичные данные нельзя редактировать",
"redis_viewer.hint.switch_auto_to_edit": "Переключитесь в режим Auto для редактирования",
"redis_viewer.label.encoding": "Кодировка: {{encoding}}",
+ "redis_viewer.label.import_database": "Исходная БД: db{{database}}",
+ "redis_viewer.label.import_selection": "Выбрано {{selected}} из {{total}} Keys",
"redis_viewer.label.keys_count": "Загружено ключей: {{count}}",
"redis_viewer.label.length": "Длина: {{count}}",
"redis_viewer.label.node_count": "Узлов: {{count}}",
- "redis_viewer.label.import_database": "Исходная БД: db{{database}}",
- "redis_viewer.label.import_selection": "Выбрано {{selected}} из {{total}} Keys",
"redis_viewer.label.original_key": "Исходный Key: {{key}}",
"redis_viewer.message.add_failed": "Не удалось добавить: {{detail}}",
"redis_viewer.message.add_success": "Добавлено",
@@ -6602,9 +6644,9 @@
"redis_viewer.modal.rename_key": "Переименовать Key",
"redis_viewer.modal.set_ttl": "Задать TTL",
"redis_viewer.modal.update_score": "Обновить оценку",
+ "redis_viewer.notice.large_keyspace_mode": "Включен режим производительности для большого keyspace. Отрисовка узлов упрощена, сохраняется до {{count}} развернутых групп.",
"redis_viewer.option.import_overwrite": "Перезаписывать существующие Key",
"redis_viewer.option.import_skip_existing": "Пропускать существующие Key",
- "redis_viewer.notice.large_keyspace_mode": "Включен режим производительности для большого keyspace. Отрисовка узлов упрощена, сохраняется до {{count}} развернутых групп.",
"redis_viewer.placeholder.key_name": "Имя Key",
"redis_viewer.placeholder.member_value": "Введите значение участника",
"redis_viewer.placeholder.new_element_value": "Введите значение нового элемента",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "Исходный текст",
"redis_viewer.view.title": "Режим просмотра",
- "redis.backend.error.address_required": "Адрес подключения Redis не может быть пустым",
- "redis.backend.error.argument_invalid_type": "{{name}} имеет недопустимый тип",
- "redis.backend.error.argument_required": "{{name}} обязателен",
- "redis.backend.error.cluster_connect_failed": "Не удалось подключиться к Redis Cluster: {{detail}}",
- "redis.backend.error.command_required": "Command не может быть пустым",
- "redis.backend.error.connect_attempt_failed": "Попытка подключения {{attempt}} завершилась ошибкой: {{detail}}",
- "redis.backend.error.connect_failed": "Не удалось подключиться к Redis: {{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "Сбой настройки TLS на попытке {{attempt}}: {{detail}}",
- "redis.backend.error.export_no_keys": "Нет Key для экспорта",
- "redis.backend.error.import_no_keys_selected": "Не выбраны Keys для импорта",
- "redis.backend.error.import_payload_invalid": "Файл импорта Redis недействителен: {{detail}}",
- "redis.backend.error.invalid_node_address": "Недопустимый адрес узла Redis: {{address}}",
- "redis.backend.error.invalid_port": "Недопустимый порт Redis: {{address}}",
- "redis.backend.error.node_address_required": "Адрес узла Redis не может быть пустым",
- "redis.backend.error.select_db_index_invalid": "Недопустимый индекс базы данных: {{value}}",
- "redis.backend.error.select_db_index_out_of_range": "Индекс базы данных должен быть в диапазоне от {{min}} до {{max}}",
- "redis.backend.error.select_db_index_required": "Для команды SELECT требуется индекс базы данных",
- "redis.backend.error.sentinel_connect_failed": "Не удалось подключиться к Redis Sentinel: {{detail}}",
- "redis.backend.error.sentinel_master_required": "Для режима Redis Sentinel требуется имя master",
- "redis.backend.error.ssh_tunnel_create_failed": "Не удалось создать SSH-туннель: {{detail}}",
- "redis.backend.error.test_connection_close_failed": "Подключение выполнено, но не удалось закрыть тестовое подключение: {{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Режим Redis {{topology}} пока не поддерживает SSH-туннели. Отключите SSH и повторите попытку.",
- "redis.backend.label.topology_cluster": "кластер",
- "redis.backend.label.topology_multi_node": "многоузловой",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "Добавление выполнено",
- "redis.backend.message.connect_success": "Подключение выполнено",
- "redis.backend.message.delete_success": "Удаление выполнено",
- "redis.backend.message.export_success": "Экспорт выполнен",
- "redis.backend.message.flush_success": "Очистка выполнена",
- "redis.backend.message.import_success": "Импорт выполнен",
- "redis.backend.message.rename_success": "Переименование выполнено",
- "redis.backend.message.select_db_success": "База данных переключена",
- "redis.backend.message.set_success": "Значение задано",
- "redis.db_alias.menu.set": "Задать псевдоним",
- "redis.db_alias.modal.placeholder": "напр. cache, sessions (оставьте пустым для сброса)",
- "redis.db_alias.modal.title": "Псевдоним для {{db}}",
"saved_query.default_name": "Запрос {{index}}",
"saved_query.error.missing_context": "В сохраненном запросе отсутствует SQL, подключение или контекст базы данных",
"security_update.action.open_ai_settings": "Настройки AI",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "Создайте 3 распространенных SQL-запроса для таблицы {{table}}.",
"sidebar.aria.switch_connection": "Переключиться на подключение {{name}}",
"sidebar.badge.recommended": "Рекомендуется",
- "sidebar.batch_databases": "Пакетные базы данных",
- "sidebar.batch_tables": "Пакетные таблицы",
"sidebar.batch.filtered_count": "Показано объектов: {{filtered}} / {{total}}",
"sidebar.batch.group.tables": "Таблицы",
"sidebar.batch.group.views": "Представления",
"sidebar.batch.no_matching_objects": "Нет подходящих объектов",
"sidebar.batch.selected_databases": "Выбрано баз данных: {{selected}} / {{total}}",
"sidebar.batch.selected_objects": "Выбрано объектов: {{selected}} / {{total}}",
+ "sidebar.batch_databases": "Пакетные базы данных",
+ "sidebar.batch_tables": "Пакетные таблицы",
"sidebar.command_search.action.ask_ai.title": "Спросить AI",
"sidebar.command_search.action.new_connection.meta": "Создать подключение к базе данных, среде выполнения или другому источнику данных",
"sidebar.command_search.action.new_connection.title": "Новый источник данных",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "Имя таблицы",
"sidebar.copy_object_name.label.view": "Имя представления",
"sidebar.error.unknown": "Неизвестная ошибка",
+ "sidebar.external_sql.directory_fallback": "SQL-каталог",
+ "sidebar.external_sql.root": "Внешние SQL-файлы",
"sidebar.external_sql_modal.action.create": "Создать",
"sidebar.external_sql_modal.action.rename": "Переименовать",
"sidebar.external_sql_modal.field.directory_name": "Имя каталога",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "Введите имя каталога",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "Имя файла не должно содержать разделители пути",
"sidebar.external_sql_modal.validation.sql_file_name_required": "Введите имя SQL-файла",
- "sidebar.external_sql.directory_fallback": "SQL-каталог",
- "sidebar.external_sql.root": "Внешние SQL-файлы",
"sidebar.field.database_name": "Имя базы данных",
"sidebar.field.new_database_name": "Новое имя базы данных",
"sidebar.field.new_table_name": "Новое имя таблицы",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "Выберите хотя бы одну базу данных.",
"sidebar.message.select_host_before_large_sql_file": "Выберите Host перед запуском большого SQL-файла.",
"sidebar.message.select_object_required": "Выберите хотя бы один объект.",
- "sidebar.message.select_table_required": "Выберите хотя бы одну таблицу.",
"sidebar.message.select_sql_directory_failed": "Не удалось выбрать SQL-каталог: {{error}}",
+ "sidebar.message.select_table_required": "Выберите хотя бы одну таблицу.",
"sidebar.message.sidebar_filter_reset": "Фильтр боковой панели сброшен.",
"sidebar.message.sidebar_filter_sync_disabled": "Синхронизация левого фильтра отключена.",
"sidebar.message.sidebar_filter_sync_enabled": "Синхронизация левого фильтра включена.",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "Пакетные операции с объектами",
"sidebar.modal.confirm_clear_selected_tables.content": "Очистить данные выбранных объектов в {{connection}} / {{database}}? Это действие нельзя отменить.",
"sidebar.modal.confirm_clear_selected_tables.title": "Подтвердите очистку выбранных таблиц",
- "sidebar.modal.confirm_delete_selected_databases.content": "Удалить выбранные базы данных ({{count}}) в {{connection}}? Это действие нельзя отменить.",
- "sidebar.modal.confirm_delete_selected_databases.title": "Подтвердите удаление выбранных баз данных",
- "sidebar.modal.confirm_delete_selected_tables.content": "Удалить выбранные таблицы ({{count}}) в {{connection}} / {{database}}? Это действие нельзя отменить.",
- "sidebar.modal.confirm_delete_selected_tables.title": "Подтвердите удаление выбранных таблиц",
+ "sidebar.modal.confirm_delete.title": "Подтвердите удаление",
"sidebar.modal.confirm_delete_connection.content": "Удалить {{name}}?",
"sidebar.modal.confirm_delete_database.content": "Удалить {{name}}? Это действие нельзя отменить.",
"sidebar.modal.confirm_delete_database.title": "Удалить базу данных",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "Удалить сохраненный запрос \"{{name}}\"? Это действие нельзя отменить.",
"sidebar.modal.confirm_delete_schema.content": "Удалить schema {{name}}? schema и все объекты внутри будут удалены. Это действие нельзя отменить.",
"sidebar.modal.confirm_delete_schema.title": "Удалить schema",
+ "sidebar.modal.confirm_delete_selected_databases.content": "Удалить выбранные базы данных ({{count}}) в {{connection}}? Это действие нельзя отменить.",
+ "sidebar.modal.confirm_delete_selected_databases.title": "Подтвердите удаление выбранных баз данных",
+ "sidebar.modal.confirm_delete_selected_tables.content": "Удалить выбранные таблицы ({{count}}) в {{connection}} / {{database}}? Это действие нельзя отменить.",
+ "sidebar.modal.confirm_delete_selected_tables.title": "Подтвердите удаление выбранных таблиц",
"sidebar.modal.confirm_delete_sql_directory.content": "Удалить \"{{name}}\"? Это удалит локальный каталог с диска; удалить можно только пустой каталог.",
"sidebar.modal.confirm_delete_sql_directory.title": "Удалить SQL-каталог",
"sidebar.modal.confirm_delete_sql_file.content": "Удалить \"{{name}}\"? Это удалит локальный файл с диска без возможности восстановления.",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "Удалить группу \"{{name}}\"? Подключения внутри нее не будут удалены.",
"sidebar.modal.confirm_delete_view.content": "Удалить {{name}}? Это действие нельзя отменить.",
"sidebar.modal.confirm_delete_view.title": "Удалить представление",
- "sidebar.modal.confirm_delete.title": "Подтвердите удаление",
"sidebar.modal.confirm_table_data_action.content": "Выполнить {{action}} для {{table}}? Это действие нельзя отменить.",
"sidebar.modal.confirm_table_data_action.title": "Подтвердите {{action}}",
"sidebar.modal.create_database.title": "Создать базу данных",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "Создать группу",
"sidebar.modal.tag.edit_description": "Обновите имя группы и входящие в нее подключения.",
"sidebar.modal.tag.edit_title": "Изменить группу",
+ "sidebar.object.function": "Функция",
+ "sidebar.object.procedure": "Процедура",
+ "sidebar.object.view": "Представление",
"sidebar.object_group.events": "События",
"sidebar.object_group.materialized_views": "Материализованные представления",
"sidebar.object_group.packages": "Пакеты",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "Таблицы",
"sidebar.object_group.triggers": "Триггеры",
"sidebar.object_group.views": "Представления",
- "sidebar.object.function": "Функция",
- "sidebar.object.procedure": "Процедура",
- "sidebar.object.view": "Представление",
"sidebar.placeholder.filter_table_view": "Фильтр таблиц и представлений",
"sidebar.placeholder.select_connection": "Выберите подключение",
"sidebar.placeholder.select_connection_first": "Сначала выберите подключение",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "Ручная область",
"sidebar.search.multi_select_supported": "Можно выбрать несколько областей",
"sidebar.search.placeholder": "Поиск...",
- "sidebar.search.scope_description": "Выберите, где должен искать сайдбар.",
- "sidebar.search.scope_hint": "В умном режиме поиск учитывает контекст и ищет по именам, хостам, базам данных и объектам.",
- "sidebar.search.scope_title": "Область поиска",
- "sidebar.search.scope_tooltip": "Текущая область поиска: {{scope}}",
"sidebar.search.scope.database": "База данных",
"sidebar.search.scope.host": "Хост",
"sidebar.search.scope.object": "Объект",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "Автоматически сужает поиск по выбранному узлу.",
"sidebar.search.scope.smart_short": "Умный",
"sidebar.search.scope.tag": "Тег",
+ "sidebar.search.scope_description": "Выберите, где должен искать сайдбар.",
+ "sidebar.search.scope_hint": "В умном режиме поиск учитывает контекст и ищет по именам, хостам, базам данных и объектам.",
+ "sidebar.search.scope_title": "Область поиска",
+ "sidebar.search.scope_tooltip": "Текущая область поиска: {{scope}}",
"sidebar.sql_directory.default_name": "SQL-каталог",
+ "sidebar.sql_file.default_name": "SQL-файл",
"sidebar.sql_file_exec.cancel": "Отменить выполнение",
"sidebar.sql_file_exec.executed_label": "Выполнено: ",
"sidebar.sql_file_exec.file_size": "Размер файла: ",
+ "sidebar.sql_file_exec.message.already_running": "Задача выполнения внешнего SQL уже запущена",
"sidebar.sql_file_exec.rows_separator": " строк | Ошибок: ",
"sidebar.sql_file_exec.rows_suffix": " строк",
- "sidebar.sql_file_exec.status_label": "Статус: ",
"sidebar.sql_file_exec.status.cancelled": "Отменено",
"sidebar.sql_file_exec.status.done": "Готово",
"sidebar.sql_file_exec.status.error": "Ошибка",
"sidebar.sql_file_exec.status.running": "Выполняется",
+ "sidebar.sql_file_exec.status_label": "Статус: ",
"sidebar.sql_file_exec.title": "Запустить внешний SQL-файл",
- "sidebar.sql_file_exec.message.already_running": "Задача выполнения внешнего SQL уже запущена",
"sidebar.sql_file_exec.workbench.action.clear_history": "Очистить историю",
"sidebar.sql_file_exec.workbench.action.run_again": "Запустить снова",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "Сейчас нет активного запуска. После выбора файла прогресс будет постоянно отображаться здесь.",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "Время старта",
"sidebar.sql_file_exec.workbench.section.config": "Параметры выполнения",
"sidebar.sql_file_exec.workbench.stage.preparing": "Подготовка к выполнению",
- "sidebar.sql_file.default_name": "SQL-файл",
"sidebar.sql_template.duckdb_macro_hint": "Используйте SQL Macro для поведения, похожего на функцию",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB пока не поддерживает хранимые процедуры",
"sidebar.sql_template.edit_routine": "Изменить {{type}} {{name}}",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "Экспортировать структуры таблиц текущей схемы · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · Действия со схемой",
"sidebar.v2_table_group_menu.current_database": "Текущая база данных",
- "sidebar.v2_table_group_menu.display_section": "Отображение",
"sidebar.v2_table_group_menu.display_create_time": "Показывать время создания",
+ "sidebar.v2_table_group_menu.display_section": "Отображение",
"sidebar.v2_table_group_menu.display_table_rows": "Показывать число строк",
"sidebar.v2_table_group_menu.display_table_size": "Показывать размер таблицы",
"sidebar.v2_table_group_menu.display_update_time": "Показывать время изменения",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "Диагностика поддерживает только запросы SELECT / WITH. Для операций записи используйте режим EXPLAIN PLAN (поддержка PR2).",
"sql_analysis.backend.error.unsupported_db_type": "Текущий источник данных ({{dbType}}) пока не поддерживает диагностику SQL. На первом этапе поддерживаются MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase.",
"sql_analysis.backend.message.completed": "Диагностика завершена",
- "sql_analysis.explain_graph.flag.filesort": "Дополнительная сортировка",
- "sql_analysis.explain_graph.flag.full_scan": "Полное сканирование",
- "sql_analysis.explain_graph.flag.temp_table": "Временная таблица",
- "sql_analysis.explain_graph.label.index": "Индекс: ",
- "sql_analysis.explain_graph.label.table": "Таблица: ",
- "sql_analysis.explain_graph.metric.actual_rows": "Факт",
- "sql_analysis.explain_graph.metric.cost": "Стоимость",
- "sql_analysis.explain_graph.metric.est_rows": "Оценка",
"sql_analysis.explain.empty": "Введите SQL и запустите диагностику",
"sql_analysis.explain.error.query_required": "Текст запроса пуст",
"sql_analysis.explain.error.run_failed": "Диагностика не выполнена",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(нет исходного текста)",
"sql_analysis.explain.view.plan": "План выполнения",
"sql_analysis.explain.view.raw": "Исходный текст",
+ "sql_analysis.explain_graph.flag.filesort": "Дополнительная сортировка",
+ "sql_analysis.explain_graph.flag.full_scan": "Полное сканирование",
+ "sql_analysis.explain_graph.flag.temp_table": "Временная таблица",
+ "sql_analysis.explain_graph.label.index": "Индекс: ",
+ "sql_analysis.explain_graph.label.table": "Таблица: ",
+ "sql_analysis.explain_graph.metric.actual_rows": "Факт",
+ "sql_analysis.explain_graph.metric.cost": "Стоимость",
+ "sql_analysis.explain_graph.metric.est_rows": "Оценка",
"sql_analysis.sidebar.node.actual_rows": "Фактические строки",
"sql_analysis.sidebar.node.buffer_hit": "Попадание в буфер",
"sql_analysis.sidebar.node.cost": "Стоимость",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "Тег {{index}}",
"store.fallback.sql_snippet_name": "Фрагмент {{index}}",
"tab_manager.close_aria": "Закрыть {{title}}",
+ "tab_manager.detached.close": "Закрыть окно",
+ "tab_manager.detached.restore": "Вернуть во вкладку",
+ "tab_manager.detached.title_fallback": "Плавающее окно",
"tab_manager.empty.action.open_ai": "Открыть AI",
"tab_manager.empty.aria.start_workbench": "Стартовая рабочая область GoNavi",
"tab_manager.empty.eyebrow.connections": "{{count}} подключений",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "Закрыть вкладки слева",
"tab_manager.menu.close_other": "Закрыть остальные вкладки",
"tab_manager.menu.close_right": "Закрыть вкладки справа",
+ "tab_manager.menu.open_in_window": "Открыть в плавающем окне",
+ "tab_manager.menu.restore_to_tab": "Вернуть во вкладку",
"tab_manager.menu.tab_display_settings": "Настройки вкладок",
"tab_manager.sql_file_close.close_tabs": "Закрыть вкладки",
"tab_manager.sql_file_close.continue_close": "Продолжить закрытие",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "Данные инициализации устарели. Обновите страницу и попробуйте снова.",
"web_auth.error.setup_required": "Сначала необходимо выполнить настройку веб-аутентификации",
"web_auth.error.setup_token_expired": "Срок действия токена инициализации истёк. Обновите страницу и попробуйте снова.",
- "web_auth.error.totp_code_required": "Введите код Google Authenticator или код восстановления",
"web_auth.error.too_many_login_attempts": "Слишком много неудачных попыток входа. Повторите позже.",
+ "web_auth.error.totp_code_required": "Введите код Google Authenticator или код восстановления",
"web_auth.page.login.code_label": "Код Google Authenticator / код восстановления",
"web_auth.page.login.code_placeholder": "6-значный код или код восстановления",
"web_auth.page.login.description": "Браузерная версия использует серверные сессии. Тайм-аут простоя, абсолютный тайм-аут и срок запоминания входа управляются сервером централизованно.",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "Коды восстановления показываются только один раз. Сохраните их офлайн:",
"web_auth.page.setup.remember_label": "Запомнить вход (дни)",
"web_auth.page.setup.secret_label": "Secret",
+ "web_auth.page.setup.session_title": "Политика сессии",
"web_auth.page.setup.step_admin_description": "Сначала задайте пароль для браузерного доступа",
"web_auth.page.setup.step_admin_hint": "Сначала создайте пароль администратора и решите, нужно ли сразу включать Google Authenticator 2FA.",
"web_auth.page.setup.step_admin_title": "Создать пароль администратора",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "Привяжите TOTP по QR-коду или вручную",
"web_auth.page.setup.step_totp_hint": "Если 2FA включена, здесь нужно привязать приложение-аутентификатор и подтвердить настройку первым кодом.",
"web_auth.page.setup.step_totp_title": "Привязать аутентификатор",
- "web_auth.page.setup.session_title": "Политика сессии",
"web_auth.page.setup.submit": "Завершить настройку и открыть GoNavi",
"web_auth.page.setup.subtitle": "При первом запуске создайте пароль администратора и сразу привяжите Google Authenticator",
"web_auth.page.setup.title": "Инициализация GoNavi Web",
diff --git a/shared/i18n/zh-CN.json b/shared/i18n/zh-CN.json
index b4ba7551..f0431997 100644
--- a/shared/i18n/zh-CN.json
+++ b/shared/i18n/zh-CN.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "创建 Claude Code 配置目录失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 配置格式异常:{{path}} 应为 {{expected}}",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "解析 Claude Code 配置失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "定位 Claude Code 配置失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "读取 Claude Code 配置失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "序列化 Claude Code 配置失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "写入 Claude Code 配置失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "已写入 Claude Code 用户级 MCP 配置,重启 Claude CLI 后可在 /mcp 的 User MCPs 中看到 GoNavi。",
+ "ai.service.mcp_client.claude_code.status.connected": "已检测到 Claude Code 用户级 GoNavi MCP 配置,且与当前 GoNavi 安装路径一致",
+ "ai.service.mcp_client.claude_code.status.missing": "未检测到 Claude Code 用户级 GoNavi MCP 配置",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "已检测到 Claude Code 中的 GoNavi MCP 记录,但当前 GoNavi 安装路径校验失败:{{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "已检测到 Claude Code 中的 GoNavi MCP 记录,但与当前 GoNavi 安装路径不一致,建议更新",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "创建 Codex 配置目录失败:{{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Codex 配置格式异常:{{path}} 无法按 {{expected}} 解析",
+ "ai.service.mcp_client.codex.config_path_failed": "定位 Codex 配置失败:{{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "读取 Codex 配置失败:{{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "写入 Codex 配置失败:{{detail}}",
+ "ai.service.mcp_client.codex.install_success": "已写入 Codex 用户级 MCP 配置,重启 Codex CLI 或桌面端后可看到 GoNavi。",
+ "ai.service.mcp_client.codex.status.connected": "已检测到 Codex 用户级 GoNavi MCP 配置,且与当前 GoNavi 安装路径一致",
+ "ai.service.mcp_client.codex.status.missing": "未检测到 Codex 用户级 GoNavi MCP 配置",
+ "ai.service.mcp_client.codex.status.path_check_failed": "已检测到 Codex 中的 GoNavi MCP 记录,但当前 GoNavi 安装路径校验失败:{{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "已检测到 Codex 中的 GoNavi MCP 记录,但与当前 GoNavi 安装路径不一致,建议更新",
+ "ai.service.mcp_client.executable_path_empty": "当前 GoNavi 可执行文件路径为空",
+ "ai.service.mcp_client.executable_path_failed": "定位当前 GoNavi 可执行文件失败:{{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} 通常部署在云端或远端环境;请通过远程 MCP 桥接接入 Windows GoNavi,数据库密码仍保存在 GoNavi 本机。",
+ "ai.service.mcp_client.user_home_dir_unavailable": "无法确定当前用户目录",
"ai_chat.builtin_tools.database.execute_sql.desc": "执行 SQL 查询并返回结果",
"ai_chat.builtin_tools.database.execute_sql.detail": "传入 connectionId、dbName 和 sql,在目标数据库上执行 SQL 并返回结果(最多 50 行)。受安全级别控制,只读模式下仅允许 SELECT/SHOW/DESCRIBE。",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "连接ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "新对话",
"ai_chat.header.export_time": "导出时间:",
"ai_chat.header.export_user": "你",
- "ai_chat.header.mode_tabs.aria_label": "AI 工作模式",
"ai_chat.header.mode.chat": "对话",
"ai_chat.header.mode.history": "历史",
"ai_chat.header.mode.insights": "自动洞察",
+ "ai_chat.header.mode_tabs.aria_label": "AI 工作模式",
"ai_chat.header.session.connected": "{{title}} · 已连接",
"ai_chat.header.tooltip.close": "关闭面板",
"ai_chat.header.tooltip.export_markdown": "导出为 Markdown",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "先按 messageId 和 contentPreview 对照当前会话,确认是哪条气泡触发的渲染异常。",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "如果需要继续缩小范围,再结合最近一次用户输入、工具结果和相关组件代码排查。",
"ai_chat.inspection.last_render_error.recorded_summary": "已记录到最近一次 AI 消息渲染异常,可据此定位是哪条消息、哪段渲染逻辑和报错栈摘要。",
+ "ai_chat.inspection.mcp.message.configured": "当前共配置 {{serverCount}} 个 MCP 服务,其中 {{enabledCount}} 个已启用",
+ "ai_chat.inspection.mcp.message.empty": "当前还没有配置任何 MCP 服务",
+ "ai_chat.inspection.mcp.message.with_issues": "当前共配置 {{serverCount}} 个 MCP 服务,其中 {{enabledCount}} 个已启用,{{issueCount}} 个配置检查项需要确认",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "先修复 MCP 服务配置错误,再重新测试服务",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "打开受影响的 MCP 服务,并按配置检查提示拆分启动命令、参数和超时时间",
+ "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 个 MCP 服务存在启动配置错误,测试和工具发现可能失败",
+ "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 个 MCP 服务存在启动配置告警,建议在排查工具发现失败前先确认",
"ai_chat.inspection.mcp_docker.message.empty": "当前没有 Docker MCP 服务",
"ai_chat.inspection.mcp_docker.message.with_enabled": "当前有 {{total}} 个 Docker MCP,其中 {{enabled}} 个已启用",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "当前有 {{total}} 个 Docker MCP,其中 {{count}} 个关键参数不完整",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "部分 MCP 工具没有声明 inputSchema,参数说明可能不完整。",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "没有找到匹配的 MCP 工具。",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "当前没有发现任何 MCP 工具,可能还没有配置 MCP 服务,或服务测试/发现失败。",
- "ai_chat.inspection.mcp.message.configured": "当前共配置 {{serverCount}} 个 MCP 服务,其中 {{enabledCount}} 个已启用",
- "ai_chat.inspection.mcp.message.empty": "当前还没有配置任何 MCP 服务",
- "ai_chat.inspection.mcp.message.with_issues": "当前共配置 {{serverCount}} 个 MCP 服务,其中 {{enabledCount}} 个已启用,{{issueCount}} 个配置检查项需要确认",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "先修复 MCP 服务配置错误,再重新测试服务",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "打开受影响的 MCP 服务,并按配置检查提示拆分启动命令、参数和超时时间",
- "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 个 MCP 服务存在启动配置错误,测试和工具发现可能失败",
- "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 个 MCP 服务存在启动配置告警,建议在排查工具发现失败前先确认",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "检查异常或取消路径是否留下了空 assistant 占位消息",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "检查流式追加逻辑是否复用了同一个 assistantMsgId,而不是为同一轮回复新建 assistant 消息",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "优先核对 useAIChatLocalTools 是否为每个 tool_call_id 写入 tool 消息",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "返回当前聊天输入区是否已经具备发送条件,包括有没有活动供应商、当前供应商是否缺密钥或接口地址、是否已选模型、当前连接/表结构上下文是否已挂载,以及下一步建议动作。适合用户问“为什么现在不能发送”“输入框到底缺什么配置”“当前 AI 聊天准备好了没有”时先读真实状态。",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "无参数",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "读取当前 AI 聊天输入区的发送前置状态,包括活动供应商、密钥和接口地址是否完整、是否已选模型、当前连接上下文和已挂载表结构数量,以及建议的下一步动作。适用于用户提到为什么现在不能发送、为什么输入区还没准备好、当前到底缺什么配置时,先读取真实状态再回答。",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "查看当前 AI 已关联的表结构上下文",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "返回当前对话已经挂载到 AI 上下文里的表清单、所属连接与数据库,以及每张表的 DDL 预览。适合用户说“看看我现在带了哪些表结构”“当前 AI 上下文是什么”时,先读取真实挂载状态再继续分析。",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "可选,DDL 截断长度,默认 4000,最大 12000",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "可选,是否附带每张表的 DDL 内容,默认 false",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(默认 false), ddlLimit?(默认 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "读取当前对话已经关联到 AI 上下文里的表结构快照,包括连接、数据库、表名,以及可选的 DDL 内容。适用于用户提到当前 AI 上下文、当前关联表、当前挂载的表结构时,先读取真实状态,避免模型凭记忆复述。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "诊断 AI 上下文体量与稳定性风险",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "估算当前或指定 AI 会话中的最近消息、工具结果、已挂载表 DDL、MCP 工具 schema、用户提示词和 Skills 体量,并返回 low/medium/high/critical 风险、主要膨胀来源和收窄建议。适合 AI 变慢、乱答、上下文过大、工具结果过长或表结构过多时调用。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "可选。是否返回最大消息、最大 DDL 表和最大 MCP schema 明细。默认 true。",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "可选。要诊断的 AI 会话 ID;省略时使用当前活动会话。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(默认当前会话), messageLimit?(默认 40), includeDetails?(默认 true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "读取 AI 上下文体量与稳定性风险快照,包括最近消息窗口、工具结果长度、已挂载表 DDL、MCP 工具 schema、用户提示词和启用的 Skills,并返回风险级别、告警和收窄建议。",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "查看当前 AI 已关联的表结构上下文",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "返回当前对话已经挂载到 AI 上下文里的表清单、所属连接与数据库,以及每张表的 DDL 预览。适合用户说“看看我现在带了哪些表结构”“当前 AI 上下文是什么”时,先读取真实挂载状态再继续分析。",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "可选,DDL 截断长度,默认 4000,最大 12000",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "可选,是否附带每张表的 DDL 内容,默认 false",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(默认 false), ddlLimit?(默认 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "读取当前对话已经关联到 AI 上下文里的表结构快照,包括连接、数据库、表名,以及可选的 DDL 内容。适用于用户提到当前 AI 上下文、当前关联表、当前挂载的表结构时,先读取真实状态,避免模型凭记忆复述。",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "查看当前 AI 提示词与 Skills 配置",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "返回当前用户自定义的全局/数据库/JVM 提示词,以及当前启用的 Skills、作用域、依赖工具和 skill prompt 内容。适合用户问“你现在到底带了哪些提示词”“为什么你会这样回答”“当前有哪些 Skills 在生效”时先读真实配置。",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "无参数",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "外部工具接入状态:未接入",
"ai_chat.mcp_client.install.state.remote": "外部工具接入状态:需配置远程 MCP 桥接",
"ai_chat.mcp_client.install.state.stale": "外部工具接入状态:已存在旧配置,需更新",
- "ai_chat.mcp_client.install.status_tone.connected": "已接入",
- "ai_chat.mcp_client.install.status_tone.not_connected": "未接入",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "远程桥接",
- "ai_chat.mcp_client.install.status_tone.status_error": "状态异常",
- "ai_chat.mcp_client.install.status_tone.update_required": "需更新",
- "ai_chat.mcp_client.install.status.cli_prefix": "CLI 检测:{{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "已检测到 {{command}}",
"ai_chat.mcp_client.install.status.cli.not_detected": "未检测到 {{command}},仍可先写配置",
"ai_chat.mcp_client.install.status.cli.remote": "远程 Agent 不需要检测本机 {{command}} 命令",
+ "ai_chat.mcp_client.install.status.cli_prefix": "CLI 检测:{{status}}",
"ai_chat.mcp_client.install.status.command_path": "命令路径:{{path}}",
"ai_chat.mcp_client.install.status.config_file": "配置文件:{{path}}",
"ai_chat.mcp_client.install.status.copy_command": "复制启动命令",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "刷新状态",
"ai_chat.mcp_client.install.status.remote_boundary": "远程接入边界:数据库连接信息和密码仍保存在 Windows GoNavi;云端 Agent 默认通过 schema-only MCP 工具读取连接摘要、对象清单、表、视图和 DDL,不注册 execute_sql。跨机器接入请使用 GoNavi Streamable HTTP 模式,并配合 token、隧道或反向代理。",
"ai_chat.mcp_client.install.status.title": "已选客户端状态",
+ "ai_chat.mcp_client.install.status_tone.connected": "已接入",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "未接入",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "远程桥接",
+ "ai_chat.mcp_client.install.status_tone.status_error": "状态异常",
+ "ai_chat.mcp_client.install.status_tone.update_required": "需更新",
"ai_chat.mcp_client.install.summary.connected": "{{label}} 已接入当前这份 GoNavi MCP,可直接在这个客户端里调用。",
"ai_chat.mcp_client.install.summary.error": "{{label}} 的接入状态读取失败,建议先刷新检测。",
"ai_chat.mcp_client.install.summary.missing": "当前还没有把这份 GoNavi MCP 接入 {{label}}。",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "读取数据库对象清单",
"ai_chat.message.tool_call.get_table_ddl": "提取建表语句",
"ai_chat.message.tool_call.get_tables": "分析表结构信息",
- "ai_chat.message.tool_call.get_views": "分析视图结构信息",
"ai_chat.message.tool_call.get_triggers": "检查触发器逻辑",
+ "ai_chat.message.tool_call.get_views": "分析视图结构信息",
"ai_chat.message.tool_call.inspect_active_tab": "读取当前活动页签",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "读取当前 AI 聊天发送前置状态",
"ai_chat.message.tool_call.inspect_ai_context_budget": "诊断 AI 上下文体量风险",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "允许",
"ai_chat.system.context.permission.denied": "禁止",
"ai_chat.system.context.skill_prompt": "以下是当前启用的 Skill「{{skillName}}」({{skillDescription}})。请在本次回答中遵循它的约束和工作方式:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "以下是当前启用的 Skill「{{skillName}}」。请在本次回答中遵循它的约束和工作方式:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\n依赖工具:{{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "以下是当前启用的 Skill「{{skillName}}」。请在本次回答中遵循它的约束和工作方式:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "当用户询问为什么不能发送、当前 AI chat 缺什么配置或输入区是否就绪时,先调用 inspect_ai_chat_readiness 读取真实发送前置状态。",
"ai_chat.system.inspection_guidance.inspect_ai_context": "当用户询问当前 AI 上下文、关联表或会话附带的表结构时,先调用 inspect_ai_context 读取已挂载的表结构上下文。",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "当用户提到 AI 慢、上下文过大、表结构过多、工具结果太长、回答不稳定,或复杂任务前需要估算上下文时,先调用 inspect_ai_context_budget 读取体量风险。",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "请输入有效的接口地址",
"ai_settings.form.api_format": "API 格式",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "留空则使用本机 CodeBuddy CLI 已登录账号;填写后优先使用当前凭证。",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(可选)",
"ai_settings.form.api_key_keep_placeholder": "留空表示继续沿用已保存密钥",
"ai_settings.form.api_key_placeholder": "sk-... / 你的 API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "留空走本机登录态,或填写 API Key / Token 覆盖",
"ai_settings.form.api_key_required": "请输入 API Key",
"ai_settings.form.api_key_saved_hint": "当前已保存 API Key。留空表示继续沿用,输入新值表示替换。",
- "ai_settings.form.api_key.codebuddy_hint": "留空则使用本机 CodeBuddy CLI 已登录账号;填写后优先使用当前凭证。",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(可选)",
"ai_settings.form.clear_saved_api_key": "清除已保存 API Key",
+ "ai_settings.form.inline_completion_model": "自动补全模型",
+ "ai_settings.form.inline_completion_model_hint": "建议选择更小、更快的模型用于 SQL 编辑器灰色联想。留空则跟随聊天模型。",
+ "ai_settings.form.inline_completion_model_placeholder": "跟随聊天模型",
"ai_settings.form.model_list": "可用模型列表(可选配置)",
"ai_settings.form.model_list_placeholder": "配置指定的模型 ID,留空则默认从服务端拉取",
"ai_settings.form.model_list_placeholder.codebuddy": "可选:预填常用模型;留空则由 CodeBuddy CLI 或服务端自动选择",
"ai_settings.form.model_list_placeholder.cursor": "可选:预填常用 Cursor 模型 ID;留空则由 Cursor 默认模型自动选择",
- "ai_settings.form.inline_completion_model": "自动补全模型",
- "ai_settings.form.inline_completion_model_hint": "建议选择更小、更快的模型用于 SQL 编辑器灰色联想。留空则跟随聊天模型。",
- "ai_settings.form.inline_completion_model_placeholder": "跟随聊天模型",
"ai_settings.form.provider_name": "供应商名称",
"ai_settings.form.provider_name_placeholder": "例如:我的自建 OpenAI / 专属大模型",
"ai_settings.form.provider_name_required": "请输入名称",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "GoNavi MCP HTTP 服务未启动",
"ai_settings.mcp_server.argument_hints.action_separator": ";",
"ai_settings.mcp_server.argument_hints.argument_details": "参数逐项说明",
- "ai_settings.mcp_server.argument_hints.business_arguments": "已识别业务参数",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "仅在 README 要求命令参数时传认证数据;优先使用环境变量。",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "访问 Token",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "在本机填写真实值;不要粘贴到聊天或截图。",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "指定 MCP 服务需要访问的服务地址或 API 入口。",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "基础 URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "填写完整地址,不要把密钥拼进 URL。",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "指向 MCP 服务使用的本地文件、目录、仓库或可执行文件。",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "配置文件",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "使用本地绝对路径,并授予最小必要范围。",
"ai_settings.mcp_server.argument_hints.business.config.detail": "指向 MCP 服务使用的本地文件、目录、仓库或可执行文件。",
"ai_settings.mcp_server.argument_hints.business.config.label": "配置文件",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "使用本地绝对路径,并授予最小必要范围。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "指向 MCP 服务使用的本地文件、目录、仓库或可执行文件。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "配置文件",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "使用本地绝对路径,并授予最小必要范围。",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "指向 MCP 服务使用的本地文件、目录、仓库或可执行文件。",
"ai_settings.mcp_server.argument_hints.business.dir.label": "目录",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "使用本地绝对路径,并授予最小必要范围。",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "指向 MCP 服务使用的本地文件、目录、仓库或可执行文件。",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "工作区目录",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "使用本地绝对路径,并授予最小必要范围。",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "已识别业务参数",
"ai_settings.mcp_server.argument_hints.category.endpoint": "地址",
"ai_settings.mcp_server.argument_hints.category.generic": "业务",
"ai_settings.mcp_server.argument_hints.category.mode": "模式",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "已识别 {{envVarCount}} 个变量,其中 {{secretLikeCount}} 个像密钥;这里只解释 key 的用途和风险,不会显示 value。",
"ai_settings.mcp_server.env_hints.title": "环境变量用途提示",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "应填:",
- "ai_settings.mcp_server.env_hints.warning_prefix": "注意:{{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "command=docker 时,这里的环境变量只传给 docker CLI,不会自动进入容器。",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} 个环境变量值为空,测试前需要补齐或删除。",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} 个环境变量看起来仍是示例占位值。",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "注意:{{warnings}}",
"ai_settings.mcp_server.form.action.delete": "删除",
"ai_settings.mcp_server.form.action.delete_cancel": "取消",
"ai_settings.mcp_server.form.action.delete_confirm": "删除这个 MCP 服务?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "已禁用",
"ai_settings.mcp_server.form.enabled.option.enabled": "已启用",
"ai_settings.mcp_server.form.enabled.title": "启用状态",
- "ai_settings.mcp_server.form.env_status.empty": "每行都要写成 KEY=VALUE;没有等号或 key 含空格的行不会保存。",
- "ai_settings.mcp_server.form.env_status.invalid": "已识别 {{validCount}} 条环境变量,另有 {{invalidCount}} 行格式无效,本次不会保存:{{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "已识别 {{count}} 条环境变量。",
"ai_settings.mcp_server.form.env.description": "每行一个 KEY=VALUE,通常用于 API Key、工作目录、服务地址等配置;不需要时可以留空。这里会保存到本机配置,并在启动 MCP 进程时作为环境变量传入;不要写 export,也不要把密钥写进聊天内容。",
"ai_settings.mcp_server.form.env.placeholder": "环境变量,每行一个 KEY=VALUE,例如:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "环境变量",
+ "ai_settings.mcp_server.form.env_status.empty": "每行都要写成 KEY=VALUE;没有等号或 key 含空格的行不会保存。",
+ "ai_settings.mcp_server.form.env_status.invalid": "已识别 {{validCount}} 条环境变量,另有 {{invalidCount}} 行格式无效,本次不会保存:{{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "已识别 {{count}} 条环境变量。",
"ai_settings.mcp_server.form.instructions.save_description": "才会把这条 MCP 长期写入本地配置。",
"ai_settings.mcp_server.form.instructions.save_title": "保存",
"ai_settings.mcp_server.form.instructions.test_description": "只会按当前字段试启动一次,检查能发现哪些工具,不会保存配置。",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "传输方式",
"ai_settings.mcp_server.guide.examples.description": "启动命令只填可执行程序本身,不要把参数混在一起。常见形式:",
"ai_settings.mcp_server.guide.examples.title": "填写示例",
- "ai_settings.mcp_server.guide.field_lookup.description": "如果看到某个参数名不知道该填什么,先看这一块;下面每个字段也都有更具体的示例和注意事项。",
- "ai_settings.mcp_server.guide.field_lookup.title": "字段速查",
"ai_settings.mcp_server.guide.field.args.avoid": "不要再填 npx/node/uvx/python/docker,也不要把多个参数粘成一个长字符串。",
"ai_settings.mcp_server.guide.field.args.detail": "例如 npx -y pkg --stdio,要拆成 -y、pkg 和 --stdio;docker run --rm -i image 要拆成 run、--rm、-i 和 image。",
"ai_settings.mcp_server.guide.field.args.fill": "逐项填 -y、包名、脚本名、-m、--stdio、run、--rm、-i、镜像名等参数。",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "保持 stdio。",
"ai_settings.mcp_server.guide.field.transport.summary": "GoNavi 用什么方式和这个 MCP Server 通信。",
"ai_settings.mcp_server.guide.field.transport.title": "传输方式",
+ "ai_settings.mcp_server.guide.field_lookup.description": "如果看到某个参数名不知道该填什么,先看这一块;下面每个字段也都有更具体的示例和注意事项。",
+ "ai_settings.mcp_server.guide.field_lookup.title": "字段速查",
"ai_settings.mcp_server.guide.full_command.apply": "自动拆分到下方字段",
"ai_settings.mcp_server.guide.full_command.description": "直接粘贴完整命令,GoNavi 会自动拆成“启动命令 / 命令参数 / 环境变量”三块;支持 Unix 的 KEY=VALUE,也支持 Windows PowerShell 的 $env:KEY=VALUE; 和 cmd 的 set KEY=VALUE && 写法。",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "将解析为:命令 {{command}},参数 {{argsCount}} 个,环境变量 {{envCount}} 个。",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "示例:",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "应填:",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "建议接入方式:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "当前边界:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "GoNavi 内置 MCP 本机入口是 stdio,适合 Claude Code / Codex 这类和 GoNavi 在同一台机器上的客户端。",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "如果 OpenClaw/Hermans 部署在云端 Linux,不能直接使用 Windows 本地 stdio 命令;可在 Windows 上启动 GoNavi Streamable HTTP 模式,再通过隧道或反向代理给云端 Agent 调用。",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "当前边界:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "无 GUI / CLI 生成配置命令:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "可复制配置片段(适用于支持 mcpServers JSON 的 Agent):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "当前提示:{{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "或设置环境变量 GONAVI_MCP_HTTP_TOKEN= 后运行 {{standaloneCommand}}",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "如果明确需要远程执行 SQL,可去掉 --schema-only;此时 execute_sql 仍受 GoNavi AI 安全控制约束,写操作必须显式传 allowMutating=true。",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目标:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "数据库连接、账号和密码继续保存在 Windows 上的 GoNavi。云端 Agent 不需要保存数据库密码。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "远程接入默认使用 schema-only 模式,不注册 execute_sql,适合只给 OpenClaw/Hermans 读取库表结构。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "云端 Agent 只通过 MCP tools 读取 get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl 等结果。",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目标:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "CLI / 服务启动命令:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. 在 {{displayName}} 中添加远程 MCP Server,transport 选择 Streamable HTTP,URL 填隧道/反向代理后的 /mcp 地址,并设置 Authorization: Bearer 。",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. 先调用 get_connections 获取 connectionId,再调用表结构工具;不要把数据库 host/user/password 写进云端 Agent 配置。",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "数据库会话补充提示词",
"ai_settings.prompts.field.global.description": "对所有 AI 会话生效,例如“先给结论”“回答保持简洁”。",
"ai_settings.prompts.field.global.title": "全局补充提示词",
- "ai_settings.prompts.field.jvm_diagnostic.description": "仅 JVM 诊断工作台生效,例如“先给计划,再给命令”。",
- "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 诊断补充提示词",
"ai_settings.prompts.field.jvm.description": "仅 JVM 资源浏览/分析场景生效。",
"ai_settings.prompts.field.jvm.title": "JVM 资源分析补充提示词",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "仅 JVM 诊断工作台生效,例如“先给计划,再给命令”。",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 诊断补充提示词",
"ai_settings.prompts.message.save_failed": "保存自定义提示词失败",
"ai_settings.prompts.message.saved": "自定义提示词已保存",
"ai_settings.prompts.placeholder.empty": "留空表示不额外追加",
"ai_settings.prompts.user.description": "这里的内容会在系统内置提示词之后,以 system message 的形式追加注入。适合放你的个人风格偏好、输出约束、团队规范。涉及安全红线时,系统规则仍然优先。",
"ai_settings.prompts.user.title": "用户级自定义提示词",
+ "ai_settings.provider.action.add": "添加模型供应商",
+ "ai_settings.provider.action.delete": "删除",
+ "ai_settings.provider.action.edit": "编辑",
+ "ai_settings.provider.auto_model": "自动选择",
+ "ai_settings.provider.confirm_delete": "确认删除?",
+ "ai_settings.provider.editor.add_title": "添加模型供应商",
+ "ai_settings.provider.editor.edit_title": "编辑模型供应商",
+ "ai_settings.provider.empty.description": "添加一个以开始使用 AI 助手",
+ "ai_settings.provider.empty.title": "暂未配置模型供应商",
+ "ai_settings.provider.next_provider": "下一个供应商",
+ "ai_settings.provider.no_model": "未选择模型",
"ai_settings.provider_preset.anthropic.desc": "Claude Opus/Sonnet 模型",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "自定义 API 端点",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "火山 Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "GLM-5 / GLM-5-Turbo 模型",
"ai_settings.provider_preset.zhipu.label": "智谱 GLM",
- "ai_settings.provider.action.add": "添加模型供应商",
- "ai_settings.provider.action.delete": "删除",
- "ai_settings.provider.action.edit": "编辑",
- "ai_settings.provider.auto_model": "自动选择",
- "ai_settings.provider.confirm_delete": "确认删除?",
- "ai_settings.provider.editor.add_title": "添加模型供应商",
- "ai_settings.provider.editor.edit_title": "编辑模型供应商",
- "ai_settings.provider.empty.description": "添加一个以开始使用 AI 助手",
- "ai_settings.provider.empty.title": "暂未配置模型供应商",
- "ai_settings.provider.next_provider": "下一个供应商",
- "ai_settings.provider.no_model": "未选择模型",
"ai_settings.safety.description": "控制 AI 可执行的 SQL 操作类型,保护数据安全",
"ai_settings.safety.full.desc": "AI 可执行所有操作(含 DDL),高危操作自动告警。",
"ai_settings.safety.full.label": "完全模式",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "数据库",
"ai_settings.skill.scope.global.desc": "所有 AI 会话都启用",
"ai_settings.skill.scope.global.label": "全局",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "仅 JVM 诊断工作台启用",
- "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 诊断",
"ai_settings.skill.scope.jvm.desc": "仅 JVM 资源分析场景启用",
"ai_settings.skill.scope.jvm.label": "JVM 资源",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "仅 JVM 诊断工作台启用",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 诊断",
"ai_settings.skill.scopes_placeholder": "选择这个 Skill 要作用到哪些场景",
"ai_settings.skill.status.disabled": "已禁用",
"ai_settings.skill.status.enabled": "已启用",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "可选",
"ai_settings.tools.parameters.required": "必填",
"ai_settings.tools.parameters.type_label": "类型:{{type}}",
- "ai_settings.tools.params_label": "参数:",
"ai_settings.tools.params.none": "无参数",
+ "ai_settings.tools.params_label": "参数:",
"ai_settings.tools.search.aria_label": "搜索内置工具",
"ai_settings.tools.search.clear": "清除",
"ai_settings.tools.search.placeholder": "搜索工具、流程或参数,例如 mcp / lineLimit / allowMutating / 事务",
"ai_settings.tools.summary": "当前显示 {{flowVisible}}/{{flowTotal}} 条推荐流程,{{toolVisible}}/{{toolTotal}} 个内置工具。",
"ai_settings.tools.workflow": "💡 工作流程:get_connections → get_databases → get_tables → get_columns → 生成 SQL",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "创建 Claude Code 配置目录失败:{{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 配置格式异常:{{path}} 应为 {{expected}}",
- "ai.service.mcp_client.claude_code.config_parse_failed": "解析 Claude Code 配置失败:{{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "定位 Claude Code 配置失败:{{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "读取 Claude Code 配置失败:{{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "序列化 Claude Code 配置失败:{{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "写入 Claude Code 配置失败:{{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "已写入 Claude Code 用户级 MCP 配置,重启 Claude CLI 后可在 /mcp 的 User MCPs 中看到 GoNavi。",
- "ai.service.mcp_client.claude_code.status.connected": "已检测到 Claude Code 用户级 GoNavi MCP 配置,且与当前 GoNavi 安装路径一致",
- "ai.service.mcp_client.claude_code.status.missing": "未检测到 Claude Code 用户级 GoNavi MCP 配置",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "已检测到 Claude Code 中的 GoNavi MCP 记录,但当前 GoNavi 安装路径校验失败:{{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "已检测到 Claude Code 中的 GoNavi MCP 记录,但与当前 GoNavi 安装路径不一致,建议更新",
- "ai.service.mcp_client.codex.config_dir_create_failed": "创建 Codex 配置目录失败:{{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Codex 配置格式异常:{{path}} 无法按 {{expected}} 解析",
- "ai.service.mcp_client.codex.config_path_failed": "定位 Codex 配置失败:{{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "读取 Codex 配置失败:{{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "写入 Codex 配置失败:{{detail}}",
- "ai.service.mcp_client.codex.install_success": "已写入 Codex 用户级 MCP 配置,重启 Codex CLI 或桌面端后可看到 GoNavi。",
- "ai.service.mcp_client.codex.status.connected": "已检测到 Codex 用户级 GoNavi MCP 配置,且与当前 GoNavi 安装路径一致",
- "ai.service.mcp_client.codex.status.missing": "未检测到 Codex 用户级 GoNavi MCP 配置",
- "ai.service.mcp_client.codex.status.path_check_failed": "已检测到 Codex 中的 GoNavi MCP 记录,但当前 GoNavi 安装路径校验失败:{{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "已检测到 Codex 中的 GoNavi MCP 记录,但与当前 GoNavi 安装路径不一致,建议更新",
- "ai.service.mcp_client.executable_path_empty": "当前 GoNavi 可执行文件路径为空",
- "ai.service.mcp_client.executable_path_failed": "定位当前 GoNavi 可执行文件失败:{{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} 通常部署在云端或远端环境;请通过远程 MCP 桥接接入 Windows GoNavi,数据库密码仍保存在 GoNavi 本机。",
- "ai.service.mcp_client.user_home_dir_unavailable": "无法确定当前用户目录",
"app.about.action.check_updates": "检查更新",
"app.about.action.download_progress": "下载进度",
"app.about.action.download_update": "下载更新",
@@ -2433,10 +2433,10 @@
"app.about.hero.update_available_version": "发现新版本 {{version}}",
"app.about.last_checked_at": "上次检查时间:{{time}}",
"app.about.last_checked_never": "尚未检查更新",
+ "app.about.message.channel_switch_failed_with_error": "切换更新通道失败:{{error}}",
"app.about.message.check_failed_with_error": "检查更新失败: {{error}}",
"app.about.message.download_completed": "更新下载完成",
"app.about.message.download_completed_with_path": "更新下载完成,更新包路径:{{path}}",
- "app.about.message.channel_switch_failed_with_error": "切换更新通道失败:{{error}}",
"app.about.message.download_failed_with_error": "更新下载失败: {{error}}",
"app.about.message.install_directory_opened_manual_replace": "已打开安装目录,请手动完成替换",
"app.about.message.install_failed_with_error": "更新安装失败: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "浏览器 mock 未接入真实 MCP 服务",
"app.browser_mock.provider.test_failed_detail": "连接测试失败:{{detail}}",
"app.browser_mock.provider.test_success": "端点连通性测试成功",
+ "app.connection.message.editable_load_failed": "读取已保存连接详情失败,当前将打开脱敏配置",
+ "app.connection.message.editable_load_failed_with_detail": "读取已保存连接详情失败:{{detail}},当前将打开脱敏配置",
"app.connection_package.action.start_export": "开始导出",
"app.connection_package.action.start_import": "开始导入",
"app.connection_package.dialog.export_title": "导出连接",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "成功导入 {{count}} 个连接,部分连接未包含密码,请编辑对应连接并输入密码后保存",
"app.connection_package.message.no_connections_to_export": "没有连接可导出",
"app.connection_package.message.unsupported_file_format": "文件格式错误:仅支持 GoNavi 恢复包、历史 JSON 连接数组、MySQL Workbench XML 或 Navicat NCX",
- "app.connection.message.editable_load_failed": "读取已保存连接详情失败,当前将打开脱敏配置",
- "app.connection.message.editable_load_failed_with_detail": "读取已保存连接详情失败:{{detail}},当前将打开脱敏配置",
"app.data_root.action.migrate_and_switch": "迁移现有数据并切换",
"app.data_root.action.open_current": "打开当前目录",
"app.data_root.action.restore_default_directory": "恢复默认目录",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "AI 设置",
"app.settings.entry.proxy.description": "统一配置更新检查、驱动管理和公共网络出口。",
"app.settings.entry.proxy.title": "全局代理",
- "app.settings.entry.web_auth.description": "查看浏览器访问认证状态,并修改管理员密码。",
- "app.settings.entry.web_auth.title": "浏览器访问认证",
"app.settings.entry.theme.description": "切换亮暗主题并调整界面观感。",
"app.settings.entry.theme.title": "主题与外观",
+ "app.settings.entry.web_auth.description": "查看浏览器访问认证状态,并修改管理员密码。",
+ "app.settings.entry.web_auth.title": "浏览器访问认证",
"app.settings.group.about.description": "查看版本信息、仓库地址和其他产品信息。",
"app.settings.group.about.title": "关于",
"app.settings.group.preferences.description": "统一管理语言、外观和侧栏显示偏好。",
"app.settings.group.preferences.title": "偏好设置",
"app.settings.group.services.description": "统一管理网络访问和 AI 相关服务配置。",
"app.settings.group.services.title": "服务配置",
+ "app.settings.sidebar_metadata.description": "选择左侧树中表名后需要展示哪些元数据。",
+ "app.settings.sidebar_metadata.title": "侧栏表元数据",
+ "app.settings.title": "设置中心",
"app.settings.web_auth.description": "这里可以查看当前浏览器访问认证状态、会话策略和 2FA 启用情况,也可以在登录后修改管理员密码。",
"app.settings.web_auth.load_failed": "读取浏览器访问认证设置失败",
"app.settings.web_auth.password.code_label": "当前验证码 / 恢复码",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} 小时",
"app.settings.web_auth.value.minutes": "{{count}} 分钟",
"app.settings.web_auth.value.recovery_codes": "剩余 {{count}} 个",
- "app.settings.sidebar_metadata.description": "选择左侧树中表名后需要展示哪些元数据。",
- "app.settings.sidebar_metadata.title": "侧栏表元数据",
- "app.settings.title": "设置中心",
"app.shortcuts.action.diagnoseQuery.description": "对当前 SQL 执行 EXPLAIN 并展示执行计划图与索引建议",
"app.shortcuts.action.diagnoseQuery.label": "SQL 诊断",
+ "app.shortcuts.action.duplicateCurrentLine.description": "在查询编辑器中复制光标所在行并插入到下一行",
+ "app.shortcuts.action.duplicateCurrentLine.label": "复制当前行到下一行",
"app.shortcuts.action.focusSidebarSearch.description": "定位到左侧连接树搜索框",
"app.shortcuts.action.focusSidebarSearch.label": "聚焦侧边栏搜索",
+ "app.shortcuts.action.formatSql.description": "格式化当前查询编辑器中的 SQL",
+ "app.shortcuts.action.formatSql.label": "美化 SQL",
"app.shortcuts.action.newConnection.description": "创建新的数据库、运行时或其他数据源连接",
"app.shortcuts.action.newConnection.label": "新建数据源",
"app.shortcuts.action.newQueryTab.description": "创建一个新的 SQL 查询标签页",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "执行 SQL",
"app.shortcuts.action.saveQuery.description": "保存当前查询页;未命名查询会打开保存弹窗",
"app.shortcuts.action.saveQuery.label": "保存查询",
- "app.shortcuts.action.duplicateCurrentLine.description": "在查询编辑器中复制光标所在行并插入到下一行",
- "app.shortcuts.action.duplicateCurrentLine.label": "复制当前行到下一行",
- "app.shortcuts.action.formatSql.description": "格式化当前查询编辑器中的 SQL",
- "app.shortcuts.action.formatSql.label": "美化 SQL",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "在当前 SQL 编辑器中手动请求 AI 灰色自动补全",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "触发 SQL AI 自动补全",
"app.shortcuts.action.selectCurrentStatement.description": "在查询编辑器中选中光标所在行并复制到剪贴板",
"app.shortcuts.action.selectCurrentStatement.label": "选择当前行并复制",
"app.shortcuts.action.sendAIChatMessage.description": "在 AI 输入框中发送当前消息,Shift+Enter 始终换行",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "切换结果区",
"app.shortcuts.action.toggleTheme.description": "在亮色和暗色主题之间切换",
"app.shortcuts.action.toggleTheme.label": "切换主题",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "在当前 SQL 编辑器中手动请求 AI 灰色自动补全",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "触发 SQL AI 自动补全",
"app.shortcuts.capture_hint": "点击“录制”后按下快捷键。按 Esc 可取消录制。全局快捷键建议包含修饰键;AI 聊天发送仅支持 Enter 相关组合,Shift+Enter 保留换行。",
"app.shortcuts.capture_waiting": "请按下快捷键...",
"app.shortcuts.context.datagrid": "数据表格",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "正在加载本地配置...",
"app.startup_readiness.loading_security_config": "正在加载安全配置...",
"app.theme.action.restore_defaults": "恢复默认",
- "app.theme.appearance_settings_description": "统一调整缩放、字体、透明度与模糊效果。",
- "app.theme.appearance_settings_title": "外观设置",
"app.theme.appearance.blur_hint": "* 仅控制应用内覆盖层的模糊效果",
"app.theme.appearance.blur_title": "高斯模糊 (Blur)",
"app.theme.appearance.enable_transparency_blur": "启用透明与模糊",
"app.theme.appearance.enable_transparency_blur_hint": "关闭后保留当前阈值,重新开启时直接恢复之前的设置。",
"app.theme.appearance.font_size_title": "基础字体大小 (Font Size)",
"app.theme.appearance.opacity_title": "背景不透明度 (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "仅影响 V2 左侧导航轨道,适合在大屏上放大按钮和连接图标。",
+ "app.theme.appearance.sidebar_rail_scale_title": "左侧导航按钮大小",
"app.theme.appearance.transparency_blur_title": "透明与模糊效果",
"app.theme.appearance.ui_scale_hint": "* 建议小屏设备设置为 85%-95%",
"app.theme.appearance.ui_scale_title": "界面缩放 (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "仅影响 V2 左侧导航轨道,适合在大屏上放大按钮和连接图标。",
- "app.theme.appearance.sidebar_rail_scale_title": "左侧导航按钮大小",
"app.theme.appearance.windows_acrylic_hint": "Windows 使用系统 Acrylic 效果,模糊程度由系统控制",
+ "app.theme.appearance_settings_description": "统一调整缩放、字体、透明度与模糊效果。",
+ "app.theme.appearance_settings_title": "外观设置",
"app.theme.data_table.column_width_hint": "标准模式默认列宽 200px;紧凑模式默认列宽 140px。已手动拖拽调整的列宽优先保留。",
"app.theme.data_table.column_width_mode": "数据表列宽模式",
"app.theme.data_table.column_width_mode.compact": "紧凑 140px",
"app.theme.data_table.column_width_mode.standard": "标准 200px",
"app.theme.data_table.density": "表格密度",
- "app.theme.data_table.density_hint": "控制行高、列宽和内边距。舒适适合大屏细看;紧凑适合最大化信息密度。已手动拖拽的列宽优先保留。",
"app.theme.data_table.density.comfortable": "舒适",
"app.theme.data_table.density.compact": "紧凑",
"app.theme.data_table.density.standard": "标准",
+ "app.theme.data_table.density_hint": "控制行高、列宽和内边距。舒适适合大屏细看;紧凑适合最大化信息密度。已手动拖拽的列宽优先保留。",
"app.theme.data_table.follow_global": "跟随全局",
"app.theme.data_table.font_size": "数据表字体大小",
"app.theme.data_table.sidebar_tree_font_size": "左侧库表字体大小",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "代码字体 (Mono Font Family)",
"app.theme.font_family.title": "字体族",
"app.theme.font_family.ui_title": "界面字体 (UI Font Family)",
- "app.theme.query_template.description": "配置新建查询标签页时默认预填的 SQL 内容。",
- "app.theme.query_template.hint": "清空后新建查询将保持空白;点击“恢复默认”可回到 SELECT * FROM 。",
- "app.theme.query_template.reset_default": "恢复默认",
- "app.theme.query_template.title": "新建查询默认 SQL",
"app.theme.mac_window.restart_hint": "* 已同步隐藏右上角自定义按钮;如系统窗口样式未立即刷新,可重启应用后再确认",
"app.theme.mac_window.title": "macOS 窗口控制",
"app.theme.mac_window.use_native_controls": "使用 macOS 原生窗口控制",
"app.theme.mac_window.use_native_controls_hint": "启用后显示左上角红黄绿按钮,并优先使用 macOS 原生全屏行为。",
- "app.theme.mode_title": "主题模式",
"app.theme.mode.dark.description": "适合低光环境,视觉更沉稳。",
"app.theme.mode.dark.label": "暗色主题",
"app.theme.mode.light.description": "适合明亮环境,层次更轻。",
"app.theme.mode.light.label": "亮色主题",
"app.theme.mode.system.description": "跟随操作系统外观并自动切换。",
"app.theme.mode.system.label": "跟随系统",
+ "app.theme.mode_title": "主题模式",
"app.theme.nav.appearance.description": "缩放、字体与透明度",
"app.theme.nav.appearance.title": "外观参数",
"app.theme.nav.theme.description": "亮色与暗色切换",
"app.theme.nav.theme.title": "主题模式",
"app.theme.navigation_title": "设置导航",
+ "app.theme.query_template.description": "配置新建查询标签页时默认预填的 SQL 内容。",
+ "app.theme.query_template.hint": "清空后新建查询将保持空白;点击“恢复默认”可回到 SELECT * FROM 。",
+ "app.theme.query_template.reset_default": "恢复默认",
+ "app.theme.query_template.title": "新建查询默认 SQL",
"app.theme.startup_window.fullscreen": "启动时全屏",
"app.theme.startup_window.fullscreen_windows": "启动时全屏(Windows 按最大化处理)",
"app.theme.startup_window.hint": "* 修改后下次启动生效",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "隐藏到后台",
"app.update.action.install_update": "安装更新",
"app.update.action.open_install_directory": "打开安装目录",
+ "app.update.backend.error.channel_invalid": "无效的更新通道:{{channel}}",
"app.update.backend.error.check_failed": "检查更新失败:{{detail}}",
"app.update.backend.error.check_http_status": "检查更新失败:HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "无效的更新通道:{{channel}}",
"app.update.backend.error.download_failed": "更新下载失败:{{detail}}",
+ "app.update.backend.error.install_target_not_writable": "当前安装目录不可写:{{path}}({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "无法确定当前安装目录",
"app.update.backend.error.install_unsupported": "当前平台暂不支持更新安装:{{platform}}",
"app.update.backend.error.latest_version_unparseable": "无法解析最新版本号",
"app.update.backend.error.network_dns": "连接 GitHub 失败:无法解析 {{host}}。请确认全局代理已应用,或在全局代理设置中先测试连接。",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS 未包含当前平台更新包",
"app.update.backend.error.sha256sums_download_failed": "下载 SHA256SUMS 失败:HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release 未提供 SHA256SUMS",
- "app.update.backend.error.install_target_not_writable": "当前安装目录不可写:{{path}}({{detail}})",
- "app.update.backend.error.install_target_unresolved": "无法确定当前安装目录",
"app.update.backend.error.update_package_not_found": "未找到更新包:{{name}}",
"app.update.backend.message.app_directory_unavailable": "无法访问应用目录:{{path}}",
"app.update.backend.message.app_directory_unresolved_download": "无法确定当前应用目录,无法下载更新",
@@ -3015,6 +3015,64 @@
"common.success": "成功",
"common.unknown": "未知",
"common.warning": "警告",
+ "connection.backend.action.apply_result_changes": "提交结果修改",
+ "connection.backend.action.clear_table": "清空表数据",
+ "connection.backend.action.create_database": "创建数据库",
+ "connection.backend.action.create_schema": "创建模式",
+ "connection.backend.action.data_sync_structure": "同步目标结构",
+ "connection.backend.action.data_sync_write": "数据同步写入",
+ "connection.backend.action.drop_database": "删除数据库",
+ "connection.backend.action.drop_function_or_procedure": "删除函数或存储过程",
+ "connection.backend.action.drop_schema": "删除模式",
+ "connection.backend.action.drop_table": "删除表",
+ "connection.backend.action.drop_view": "删除视图",
+ "connection.backend.action.import_data": "导入数据",
+ "connection.backend.action.preview_result_changes": "预览结果修改",
+ "connection.backend.action.rename_database": "重命名数据库",
+ "connection.backend.action.rename_schema": "重命名模式",
+ "connection.backend.action.rename_table": "重命名表",
+ "connection.backend.action.rename_view": "重命名视图",
+ "connection.backend.action.truncate_table": "截断表数据",
+ "connection.backend.error.readonly_action_blocked": "当前连接已启用生产保护,禁止执行{{action}}",
+ "connection.copy_suffix": " - 副本",
+ "connection.delete": "删除连接",
+ "connection.edit": "编辑连接",
+ "connection.new": "新建连接",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase 当前仅支持 MySQL/Oracle 租户协议,不支持 \"{{value}}\";请改为 MySQL 或 Oracle。",
+ "connection.sidebar.delete.backendUnavailable": "删除连接失败:后端接口不可用",
+ "connection.sidebar.delete.confirmContent": "确定要删除连接 \"{{name}}\" 吗?",
+ "connection.sidebar.delete.confirmTitle": "确认删除",
+ "connection.sidebar.delete.failureFallback": "删除连接失败",
+ "connection.sidebar.delete.success": "已删除连接",
+ "connection.sidebar.disconnect.success": "已断开连接",
+ "connection.sidebar.duplicate.backendUnavailable": "复制连接失败:后端接口不可用",
+ "connection.sidebar.duplicate.failureFallback": "复制连接失败",
+ "connection.sidebar.duplicate.noResult": "复制连接失败:后端未返回结果",
+ "connection.sidebar.duplicate.success": "已复制连接: {{name}}",
+ "connection.sidebar.group.badge": "分组",
+ "connection.sidebar.group.collapseAria": "折叠连接分组 {{name}}",
+ "connection.sidebar.group.delete": "删除分组",
+ "connection.sidebar.group.deleteConfirmContent": "确定要删除分组 \"{{name}}\" 吗?这不会删除里面的连接。",
+ "connection.sidebar.group.deleteConfirmTitle": "确认删除",
+ "connection.sidebar.group.edit": "编辑分组",
+ "connection.sidebar.group.expandAria": "展开连接分组 {{name}}",
+ "connection.sidebar.group.meta": "{{count}} 个连接 · 连接分组",
+ "connection.sidebar.group.untitled": "未命名分组",
+ "connection.sidebar.menu.copy": "复制连接",
+ "connection.sidebar.menu.createDatabase": "新建数据库",
+ "connection.sidebar.menu.current": "当前",
+ "connection.sidebar.menu.delete": "删除连接",
+ "connection.sidebar.menu.disconnect": "断开连接",
+ "connection.sidebar.menu.groupSection": "连接分组",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "未配置地址",
+ "connection.sidebar.menu.moveOutTag": "移出标签",
+ "connection.sidebar.menu.moveToTag": "移至标签",
+ "connection.sidebar.menu.moveToUngrouped": "移出分组",
+ "connection.sidebar.menu.refresh": "刷新连接",
+ "connection.sidebar.menu.section": "连接",
+ "connection.test": "测试连接",
+ "connection.unnamed": "未命名连接",
"connection_modal.action.browse": "浏览...",
"connection_modal.action.cancel": "取消",
"connection_modal.action.close": "关闭",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "输入、生成或解析连接 URI。",
"connection_modal.config_section.uri.title": "连接 URI",
"connection_modal.db_icon_label.custom": "自定义",
+ "connection_modal.db_type.custom": "自定义",
"connection_modal.db_type_hint.custom": "使用自定义驱动和 DSN 连接数据库。",
"connection_modal.db_type_hint.file": "选择本地 SQLite 或 DuckDB 数据库文件。",
"connection_modal.db_type_hint.mongodb": "连接 MongoDB 单节点、Replica Set 或 SRV 地址。",
"connection_modal.db_type_hint.redis": "连接 Redis 单机或 Redis Cluster。",
"connection_modal.db_type_hint.standard": "填写主机、端口、认证信息和可选数据库。",
- "connection_modal.db_type.custom": "自定义",
"connection_modal.driver.current": "当前",
"connection_modal.error.unknown": "未知错误",
"connection_modal.error.unknown_exception": "未知错误",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "连接名称",
"connection_modal.field.connection_timeout_seconds": "连接超时(秒)",
"connection_modal.field.connection_timeout_seconds_ascii": "连接超时(秒)",
- "connection_modal.field.default_database_optional": "默认连接数据库(可选)",
"connection_modal.field.defaultDatabase.placeholder": "例如:appdb",
+ "connection_modal.field.default_database_optional": "默认连接数据库(可选)",
"connection_modal.field.display_databases_optional": "显示数据库(可选)",
- "connection_modal.field.driver_name": "驱动名称",
"connection_modal.field.driver.placeholder": "例如: mysql, postgres",
+ "connection_modal.field.driver_name": "驱动名称",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "例如: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "文件路径(绝对路径)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Replica Set 用户名(可选)",
"connection_modal.field.replica_username_optional": "从库用户名(可选)",
"connection_modal.field.save_password": "保存密码",
- "connection_modal.field.service_name": "服务名",
"connection_modal.field.serviceName.placeholder": "例如:ORCLPDB1",
+ "connection_modal.field.service_name": "服务名",
"connection_modal.field.ssh_host": "SSH 主机",
"connection_modal.field.ssh_password": "SSH 密码",
"connection_modal.field.ssh_user": "SSH 用户",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "通过 GoNavi Agent 连接,适用于无法直连的网络环境。",
"connection_modal.jvm.agent_help": "GoNavi Agent 服务的基础 URL。",
"connection_modal.jvm.agent_url": "Agent 地址",
- "connection_modal.jvm.diagnostic_api_key_optional": "诊断 API 密钥(可选)",
- "connection_modal.jvm.diagnostic_description": "启用可选诊断命令,用于 JVM 故障排查。",
- "connection_modal.jvm.diagnostic_disabled_hint": "诊断增强未启用,仅在需要运行时排查时开启。",
- "connection_modal.jvm.diagnostic_timeout_seconds": "诊断超时(秒)",
- "connection_modal.jvm.diagnostic_title": "诊断增强",
- "connection_modal.jvm.diagnostic_transport": "诊断传输",
"connection_modal.jvm.diagnostic.agent_bridge_description": "使用 GoNavi Agent Bridge 诊断 Endpoint。",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "通过 Arthas Tunnel 访问目标 JVM。",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Arthas Tunnel 服务器的基础 URL。",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "允许 trace 与 watch 等会增加运行时开销的命令。",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "诊断 API 密钥(可选)",
+ "connection_modal.jvm.diagnostic_description": "启用可选诊断命令,用于 JVM 故障排查。",
+ "connection_modal.jvm.diagnostic_disabled_hint": "诊断增强未启用,仅在需要运行时排查时开启。",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "诊断超时(秒)",
+ "connection_modal.jvm.diagnostic_title": "诊断增强",
+ "connection_modal.jvm.diagnostic_transport": "诊断传输",
"connection_modal.jvm.endpoint_api_key_optional": "Endpoint API 密钥(可选)",
"connection_modal.jvm.endpoint_description": "使用服务暴露的 Endpoint 连接,而不是直连 JMX。",
"connection_modal.jvm.endpoint_help": "JVM 管理 Endpoint 的基础 URL。",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "只配置一个 NameServer,适合本地或简单环境。",
"connection_modal.messageQueue.rocketmq.topology.single.label": "单 NameServer",
"connection_modal.messageQueue.topology.cluster.label": "集群模式",
- "connection_modal.mongodb.auth_mechanism": "认证机制",
"connection_modal.mongodb.auth.auto": "自动",
"connection_modal.mongodb.auth.auto_description": "由驱动自动选择认证机制。",
"connection_modal.mongodb.auth.aws_iam_description": "使用 AWS IAM 认证,请在运行环境中提供 AWS IAM 凭据。",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "不使用 MongoDB 认证连接。",
"connection_modal.mongodb.auth.scram_sha1_description": "使用 SCRAM-SHA-1 认证。",
"connection_modal.mongodb.auth.scram_sha256_description": "使用 SCRAM-SHA-256 认证。",
+ "connection_modal.mongodb.auth_mechanism": "认证机制",
"connection_modal.mongodb.discovery.current": "当前",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV 与 SSH 隧道同时启用时,可能依赖本地 DNS 解析能力",
"connection_modal.mongodb.discovery.srv.description": "使用 mongodb+srv,由 DNS 发现目标节点。",
"connection_modal.mongodb.discovery.srv.label": "SRV 地址",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV 与 SSH 隧道同时启用时,可能依赖本地 DNS 解析能力",
"connection_modal.mongodb.discovery.standard.description": "使用 host:port 直连或副本集节点列表。",
"connection_modal.mongodb.discovery.standard.label": "标准地址",
"connection_modal.mongodb.members.health": "健康",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "开",
"connection_modal.table.health": "健康",
"connection_modal.table.role": "角色",
+ "connection_modal.test.redis_database_list_failure": "连接成功,但获取 Redis 数据库列表失败:{{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "连接成功但拉取 Redis 数据库列表超时(>{{seconds}} 秒)",
"connection_modal.test_error.description": "查看后端返回的完整错误信息。",
"connection_modal.test_error.empty": "没有错误详情",
"connection_modal.test_error.title": "连接测试失败原因",
- "connection_modal.test.redis_database_list_failure": "连接成功,但获取 Redis 数据库列表失败:{{detail}}",
- "connection_modal.test.redis_database_list_timeout": "连接成功但拉取 Redis 数据库列表超时(>{{seconds}} 秒)",
"connection_modal.title.create": "新建 {{type}} 连接",
"connection_modal.title.create_description": "填写连接配置并保存。",
"connection_modal.title.edit": "编辑连接",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "请输入 HTTP Tunnel 主机",
"connection_modal.validation.tunnel_port_required": "请输入 HTTP Tunnel 端口",
"connection_modal.validation.username_required": "请输入用户名",
- "connection.backend.action.apply_result_changes": "提交结果修改",
- "connection.backend.action.clear_table": "清空表数据",
- "connection.backend.action.create_database": "创建数据库",
- "connection.backend.action.create_schema": "创建模式",
- "connection.backend.action.data_sync_structure": "同步目标结构",
- "connection.backend.action.data_sync_write": "数据同步写入",
- "connection.backend.action.drop_database": "删除数据库",
- "connection.backend.action.drop_function_or_procedure": "删除函数或存储过程",
- "connection.backend.action.drop_schema": "删除模式",
- "connection.backend.action.drop_table": "删除表",
- "connection.backend.action.drop_view": "删除视图",
- "connection.backend.action.import_data": "导入数据",
- "connection.backend.action.preview_result_changes": "预览结果修改",
- "connection.backend.action.rename_database": "重命名数据库",
- "connection.backend.action.rename_schema": "重命名模式",
- "connection.backend.action.rename_table": "重命名表",
- "connection.backend.action.rename_view": "重命名视图",
- "connection.backend.action.truncate_table": "截断表数据",
- "connection.backend.error.readonly_action_blocked": "当前连接已启用生产保护,禁止执行{{action}}",
- "connection.copy_suffix": " - 副本",
- "connection.delete": "删除连接",
- "connection.edit": "编辑连接",
- "connection.new": "新建连接",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase 当前仅支持 MySQL/Oracle 租户协议,不支持 \"{{value}}\";请改为 MySQL 或 Oracle。",
- "connection.sidebar.delete.backendUnavailable": "删除连接失败:后端接口不可用",
- "connection.sidebar.delete.confirmContent": "确定要删除连接 \"{{name}}\" 吗?",
- "connection.sidebar.delete.confirmTitle": "确认删除",
- "connection.sidebar.delete.failureFallback": "删除连接失败",
- "connection.sidebar.delete.success": "已删除连接",
- "connection.sidebar.disconnect.success": "已断开连接",
- "connection.sidebar.duplicate.backendUnavailable": "复制连接失败:后端接口不可用",
- "connection.sidebar.duplicate.failureFallback": "复制连接失败",
- "connection.sidebar.duplicate.noResult": "复制连接失败:后端未返回结果",
- "connection.sidebar.duplicate.success": "已复制连接: {{name}}",
- "connection.sidebar.group.badge": "分组",
- "connection.sidebar.group.collapseAria": "折叠连接分组 {{name}}",
- "connection.sidebar.group.delete": "删除分组",
- "connection.sidebar.group.deleteConfirmContent": "确定要删除分组 \"{{name}}\" 吗?这不会删除里面的连接。",
- "connection.sidebar.group.deleteConfirmTitle": "确认删除",
- "connection.sidebar.group.edit": "编辑分组",
- "connection.sidebar.group.expandAria": "展开连接分组 {{name}}",
- "connection.sidebar.group.meta": "{{count}} 个连接 · 连接分组",
- "connection.sidebar.group.untitled": "未命名分组",
- "connection.sidebar.menu.copy": "复制连接",
- "connection.sidebar.menu.createDatabase": "新建数据库",
- "connection.sidebar.menu.current": "当前",
- "connection.sidebar.menu.delete": "删除连接",
- "connection.sidebar.menu.disconnect": "断开连接",
- "connection.sidebar.menu.groupSection": "连接分组",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "未配置地址",
- "connection.sidebar.menu.moveOutTag": "移出标签",
- "connection.sidebar.menu.moveToTag": "移至标签",
- "connection.sidebar.menu.moveToUngrouped": "移出分组",
- "connection.sidebar.menu.refresh": "刷新连接",
- "connection.sidebar.menu.section": "连接",
- "connection.test": "测试连接",
- "connection.unnamed": "未命名连接",
"data_export.action.clear": "清空",
"data_export.action.clear_progress": "清空当前进度",
"data_export.action.select_all": "全选",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "此刻",
"data_grid.cell_editor.title": "编辑单元格",
"data_grid.cell_editor.title_with_column": "编辑单元格:{{column}}",
+ "data_grid.column.comment_tooltip": "注释:{{comment}}",
+ "data_grid.column.drag_tooltip": "拖动调整列顺序",
+ "data_grid.column.foreign_key_jump_title": "跳转到外键表:{{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "外键:{{target}}",
+ "data_grid.column.resize_tooltip": "拖动调整列宽,双击自动适配",
+ "data_grid.column.type_tooltip": "类型:{{type}}",
"data_grid.column_quick_find.placeholder": "跳到字段列...",
"data_grid.column_quick_find.tooltip": "输入字段名,回车或点定位按钮即可跳到对应列",
"data_grid.column_settings.column_visibility": "列显示",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "全显示",
"data_grid.column_settings.show_comments": "在表头显示列注释",
"data_grid.column_settings.show_types": "在表头显示列类型",
- "data_grid.column.comment_tooltip": "注释:{{comment}}",
- "data_grid.column.drag_tooltip": "拖动调整列顺序",
- "data_grid.column.foreign_key_jump_title": "跳转到外键表:{{tableName}}",
- "data_grid.column.foreign_key_tooltip": "外键:{{target}}",
- "data_grid.column.resize_tooltip": "拖动调整列宽,双击自动适配",
- "data_grid.column.type_tooltip": "类型:{{type}}",
"data_grid.context_menu.auto_fit_column": "按内容自适应列宽",
"data_grid.context_menu.clear_column_sort": "取消此字段排序",
"data_grid.context_menu.column_display_section": "字段显示",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "未选择行,请选择导出范围:",
"data_grid.export.options_title": "导出选项",
"data_grid.export.query_result_title": "导出查询结果",
- "data_grid.export.scope_prompt": "请选择导出范围:",
"data_grid.export.scope.all_results_cached": "全部结果(当前缓存 {{count}} 条)",
"data_grid.export.scope.all_results_cached_description": "当前查询缺少可重放 SQL 时,将导出当前缓存的全部结果。",
"data_grid.export.scope.all_results_requery": "全部结果(重新查询)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "选中行",
"data_grid.export.scope.selected_rows_count": "选中行({{count}} 条)",
"data_grid.export.scope.selected_rows_description": "仅导出当前结果集中已勾选的行。",
+ "data_grid.export.scope_prompt": "请选择导出范围:",
"data_grid.export.selected_rows": "导出选中行({{count}} 行)",
"data_grid.filter.add_condition": "添加条件",
"data_grid.filter.add_sort": "添加排序",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "跳",
"data_grid.pagination.jump_aria": "跳转页码",
"data_grid.pagination.jump_label": "跳页",
- "data_grid.pagination.page_size_aria": "每页行数",
- "data_grid.pagination.page_size_option": "{{count}} 行 / 页",
"data_grid.pagination.page.current": "第 {{current}} 页",
"data_grid.pagination.page.known": "第 {{current}} / {{totalPages}} 页",
+ "data_grid.pagination.page_size_aria": "每页行数",
+ "data_grid.pagination.page_size_option": "{{count}} 行 / 页",
"data_grid.pagination.result_set": "结果集",
"data_grid.pagination.summary.approximate": "当前 {{current}} 条 / 约 {{total}} 条",
"data_grid.pagination.summary.cancelled": "当前 {{current}} 条 / 计数已停止",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "配置源与目标",
"data_sync.step.result": "执行结果",
"data_sync.step.select_tables": "选择表",
- "data_sync.table_picker.help": "请选择需要同步的表:",
- "data_sync.table_picker.item_unit": "项",
- "data_sync.table_picker.items_unit": "项",
- "data_sync.table_picker.not_found": "暂无数据",
- "data_sync.table_picker.search_placeholder": "搜索表...",
- "data_sync.table_picker.selected_title": "已选表",
- "data_sync.table_picker.show_same": "显示相同表",
- "data_sync.table_picker.source_title": "源表",
"data_sync.table.delete": "删除",
"data_sync.table.insert": "插入",
"data_sync.table.plan": "计划",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "不存在",
"data_sync.table.target_table": "目标表",
"data_sync.table.update": "更新",
+ "data_sync.table_picker.help": "请选择需要同步的表:",
+ "data_sync.table_picker.item_unit": "项",
+ "data_sync.table_picker.items_unit": "项",
+ "data_sync.table_picker.not_found": "暂无数据",
+ "data_sync.table_picker.search_placeholder": "搜索表...",
+ "data_sync.table_picker.selected_title": "已选表",
+ "data_sync.table_picker.show_same": "显示相同表",
+ "data_sync.table_picker.source_title": "源表",
"data_sync.title.compare_result": "对比结果",
"data_sync.title.execution_log": "执行日志",
"data_sync.title.migration": "跨数据源迁移",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "未找到数据库连接",
"definition_viewer.error.event_name_empty": "事件名称为空",
"definition_viewer.error.load_failed": "加载失败",
+ "definition_viewer.error.package_name_empty": "存储包名称为空",
"definition_viewer.error.query_failed": "查询定义失败",
"definition_viewer.error.query_failed_detail": "查询定义失败:{{detail}}",
- "definition_viewer.error.package_name_empty": "存储包名称为空",
"definition_viewer.error.routine_name_empty": "函数/存储过程名称为空",
"definition_viewer.error.sequence_name_empty": "序列名称为空",
"definition_viewer.error.view_name_empty": "视图名称为空",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "旧版",
"dev.perf_data_grid.ui_version.v2": "新版 UI",
"dev.perf_data_grid.ui_version.v2_short": "新版",
+ "driver.guidance.customConnectionDriverHelp": "已支持: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase;别名支持 postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。请填写 GoNavi 已注册的 Go database/sql 驱动名,不能直接填写系统 ODBC/JDBC 驱动名或导入 JDBC Jar。",
"driver_manager.action.close": "关闭",
"driver_manager.action.import_directory": "导入驱动目录",
"driver_manager.action.import_package": "导入驱动包",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "行内“导入驱动包”仅用于单个驱动文件/总包(如 `mariadb-driver-agent`、`mariadb-driver-agent.exe`、`GoNavi-DriverAgents.zip`),不支持直接导入 JDBC Jar;批量导入请使用上方“导入驱动目录”。",
"driver_manager.local_source.directory": "目录",
"driver_manager.local_source.file": "文件",
- "driver_manager.log_modal.empty": "当前驱动暂无操作日志。",
- "driver_manager.log_modal.executable_path": "驱动可执行文件:{{path}}",
- "driver_manager.log_modal.install_dir": "安装目录:{{path}}",
- "driver_manager.log_modal.title": "驱动日志 - {{name}}",
"driver_manager.log.done_auto_install": "自动安装完成{{version}}",
"driver_manager.log.done_local_import": "本地导入安装完成{{version}}",
"driver_manager.log.done_remove": "驱动移除完成",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "开始自动安装",
"driver_manager.log.start_local_import": "开始本地导入{{version}}({{source}}):{{path}}",
"driver_manager.log.start_remove": "开始移除驱动",
+ "driver_manager.log_modal.empty": "当前驱动暂无操作日志。",
+ "driver_manager.log_modal.executable_path": "驱动可执行文件:{{path}}",
+ "driver_manager.log_modal.install_dir": "安装目录:{{path}}",
+ "driver_manager.log_modal.title": "驱动日志 - {{name}}",
"driver_manager.message.directory_import_completed": "目录导入完成{{mode}}:成功 {{success}}{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "目录导入完成{{mode}}:成功 {{success}},失败 {{failed}}{{skip}}",
"driver_manager.message.directory_import_failed": "目录导入失败{{mode}}:失败 {{failed}}{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "选择本地驱动包目录失败:{{detail}}",
"driver_manager.message.select_local_file_failed": "选择本地驱动包文件失败",
"driver_manager.message.select_local_file_failed_detail": "选择本地驱动包文件失败:{{detail}}",
- "driver_manager.message.skip_suffix": ",{{items}}",
"driver_manager.message.skip.dedupe": "去重跳过 {{count}}",
"driver_manager.message.skip.slim": "精简版跳过 {{count}}",
+ "driver_manager.message.skip_suffix": ",{{items}}",
"driver_manager.network.alert.download_chain_unreachable": "重要提醒:驱动下载链路域名不可达",
"driver_manager.network.alert.download_network_unreachable": "重要提醒:驱动下载网络不可达",
"driver_manager.network.chain_alert.allow_hosts": "若仍失败,请在代理规则放行:{{hosts}};仍无法调整规则时,再考虑开启 TUN 模式。",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "当前已安装 {{installedVersion}},已选择 {{targetVersion}},点击“切换版本”生效",
"driver_manager.version.target_fallback": "目标版本",
"driver_manager.version.unlabeled": "未标注版本",
- "driver.guidance.customConnectionDriverHelp": "已支持: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase;别名支持 postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。请填写 GoNavi 已注册的 Go database/sql 驱动名,不能直接填写系统 ODBC/JDBC 驱动名或导入 JDBC Jar。",
"file.backend.dialog.export_connections": "导出连接",
"file.backend.dialog.export_data": "导出数据",
"file.backend.dialog.export_database_sql": "导出 {{database}} (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "正在导入数据...",
"import_preview.status.loading_preview": "加载预览数据...",
"import_preview.title": "导入数据预览",
+ "jvm.backend.capability.reason.read_only": "当前连接只读",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "请填写完整的 `http://` 或 `https://` 地址,例如 `http://127.0.0.1:19090/gonavi/agent/jvm`。",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 连接失败:Agent Base URL 格式不合法。",
+ "jvm.backend.connection_error.agent.base_url_required": "Agent 连接失败:未填写 Agent Base URL。",
+ "jvm.backend.connection_error.agent.connection_refused.help": "请确认 Java 服务已通过 `-javaagent` 启动 GoNavi Agent,并检查 Base URL、端口映射和防火墙。",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 连接失败:目标 Agent 管理端口未监听,或当前地址不可达。",
+ "jvm.backend.connection_error.agent.forbidden.help": "请确认当前客户端来源、鉴权配置和 Agent 访问策略允许 GoNavi 访问。",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Agent 连接失败:当前请求被 Agent 拒绝。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "请把 Agent Base URL 改成 `http://` 或 `https://` 开头的地址。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 连接失败:当前只支持 HTTP 或 HTTPS 协议。",
+ "jvm.backend.connection_error.agent.timeout.help": "请确认目标地址可达、Agent 已完成启动,并适当增加连接超时时间。",
+ "jvm.backend.connection_error.agent.timeout.summary": "Agent 连接失败:访问 Agent 管理端口超时。",
+ "jvm.backend.connection_error.agent.unauthorized.help": "请检查连接中的 Agent API Key 是否与目标服务启动参数一致。",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 连接失败:Agent 已响应,但当前 API Key 无效或缺失。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "请填写完整的 `http://` 或 `https://` 地址,并指向实现 GoNavi JVM HTTP 合约的管理接口根路径,例如 `http://127.0.0.1:19090/manage/jvm`。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 连接失败:Endpoint Base URL 格式不合法。",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 连接失败:未填写 Endpoint Base URL。",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "请确认 Base URL 指向实现 GoNavi JVM HTTP 合约的管理接口,并检查服务监听、端口映射和防火墙。",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 连接失败:目标管理接口未监听,或当前地址不可达。",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "请确认当前客户端来源、鉴权配置和访问策略允许 GoNavi 访问该管理接口。",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 连接失败:当前请求被目标管理接口拒绝。",
+ "jvm.backend.connection_error.endpoint.not_found.help": "请确认 Base URL 指向的是 JVM 管理接口根路径,而不是普通业务接口、健康检查地址或网关首页。",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 连接失败:目标地址已响应,但没有找到 GoNavi JVM 管理接口。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "请把 Endpoint Base URL 改成 `http://` 或 `https://` 开头的地址。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 连接失败:当前只支持 HTTP 或 HTTPS 协议。",
+ "jvm.backend.connection_error.endpoint.timeout.help": "请确认 Base URL 可达、目标服务已完成启动,并适当增加连接超时时间。",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 连接失败:访问目标管理接口超时。",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "请检查连接中的 Endpoint API Key 是否与目标服务配置一致。",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 连接失败:目标管理接口已响应,但当前 API Key 无效或缺失。",
+ "jvm.backend.connection_error.generic": "JVM 连接失败",
+ "jvm.backend.connection_error.jmx.auth.help": "请确认目标 JMX 是否关闭认证;如果必须认证,需要补充用户名/密码后再连接。",
+ "jvm.backend.connection_error.jmx.auth.summary": "JMX 连接失败:{{target}} 需要认证,或当前凭据不可用。",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "请确认目标 JVM 已开启远程 JMX,并检查主机、防火墙、端口映射和 SSH/代理配置。",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 连接失败:无法连接到 {{target}},对应端口没有监听或当前网络不可达。",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "请确认填写的是 JVM 真正对外暴露的 JMX 端口,而不是业务端口、调试端口或被代理转发的端口。",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 连接失败:{{target}} 上的服务主动断开了连接,当前端口不是兼容的标准 JMX RMI 端口。",
+ "jvm.backend.connection_error.jmx.host_required": "JMX 连接失败:未填写主机地址。",
+ "jvm.backend.connection_error.jmx.java_missing.help": "请先安装 JRE/JDK,或通过环境变量 `GONAVI_JMX_JAVA_BIN` 指向正确的 `java` 可执行文件。",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 连接失败:当前机器未找到 `java` 运行时,GoNavi 无法启动 JMX helper。",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "这通常意味着填到了 RMI 注册端口、调试端口或其他 Java 服务端口。请检查 `jmxremote.port` 和 `jmxremote.rmi.port` 配置是否正确。",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 连接失败:{{target}} 上虽然有 RMI 服务,但不是可用的 JMX RMIServer 端口。",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "请改填应用实际暴露的 JMX 端口,而不是业务 `server.port`。如果服务只开启了 `-Dcom.sun.management.jmxremote`,但没有配置 `jmxremote.port`,也无法直接远程连接。",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 连接失败:{{target}} 不是标准 JMX 远程管理端口,当前更像普通业务端口或 HTTP 端口。",
+ "jvm.backend.connection_error.jmx.port_invalid": "JMX 连接失败:端口无效,请填写 1-65535 之间的有效端口。",
+ "jvm.backend.connection_error.jmx.timeout.help": "请确认端口可达、网络未被拦截,并适当增加连接超时时间。",
+ "jvm.backend.connection_error.jmx.timeout.summary": "JMX 连接失败:连接 {{target}} 超时。",
+ "jvm.backend.connection_error.suggestion": "建议:{{detail}}",
+ "jvm.backend.connection_error.technical_detail": "技术细节:{{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel 地址格式不正确:{{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel 地址不能为空",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "当前 Arthas Tunnel 会话的活动命令与待取消命令不一致",
+ "jvm.backend.diagnostic.arthas.command_already_running": "当前 Arthas Tunnel 会话已有命令在执行,请先等待完成或取消",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel 命令已中止",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel 命令执行超时,{{timeout}} 内未完成",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "建立 Arthas Tunnel WebSocket 连接已中止",
+ "jvm.backend.diagnostic.arthas.connect_failed": "建立 Arthas Tunnel WebSocket 连接失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "建立 Arthas Tunnel WebSocket 连接超时,{{timeout}} 内未收到响应",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 连接已关闭:{{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 连接已关闭:code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 连接尚未建立完成,请稍后重试",
+ "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 连接失败:HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "当前 Arthas Tunnel 会话没有正在执行的命令",
+ "jvm.backend.diagnostic.arthas.read_canceled": "读取 Arthas Tunnel 输出已中止",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel 读取超时设置失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "读取 Arthas Tunnel 输出失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "读取 Arthas Tunnel 输出超时,{{timeout}} 内未收到响应",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel 请求编码失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel 仅支持 http/https/ws/wss 地址:{{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "向 Arthas Tunnel 发送终端指令已中止",
+ "jvm.backend.diagnostic.arthas.send_failed": "向 Arthas Tunnel 发送终端指令失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "向 Arthas Tunnel 发送终端指令超时,{{timeout}} 内未收到响应",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel 会话配置已变化,请重新创建诊断会话",
+ "jvm.backend.diagnostic.arthas.session_missing": "诊断会话不存在,请重新创建 Arthas Tunnel 会话",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel 需要填写目标实例标识(targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "找不到目标实例,请确认 targetId / agentId 是否填写正确,且对应 tunnel client 已在线",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "找不到目标实例 {{target}},请确认 targetId / agentId 是否填写正确,且对应 tunnel client 已在线",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 终端指令编码失败:{{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel 写入超时设置失败:{{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "诊断审计记录写入失败,已阻止命令执行: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "取消命令缺少 sessionId 或 commandId",
+ "jvm.backend.diagnostic.error.command_required": "诊断命令不能为空",
+ "jvm.backend.diagnostic.error.disabled": "当前连接未启用 JVM 诊断增强模式",
+ "jvm.backend.diagnostic.error.execute_canceled": "诊断执行请求已中止:{{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "诊断会话 ID 不能为空,请先创建会话",
+ "jvm.backend.diagnostic.error.transport_unsupported": "不支持的 JVM 诊断传输模式:{{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas 命令已中止",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas 命令执行完成",
+ "jvm.backend.diagnostic.message.cancel_requested": "已发送取消请求,等待诊断桥接端结束命令",
+ "jvm.backend.diagnostic.message.command_completed": "诊断命令执行完成",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "诊断命令不支持换行或多命令输入",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "当前连接未开放高风险诊断命令:{{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "当前连接未开放观察类诊断命令:{{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "当前连接为只读模式,仅允许观察类诊断命令",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "当前连接未开放跟踪类诊断命令:{{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "审计记录写入失败: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "审计记录写入失败,已阻止 JVM 变更: {{detail}}",
+ "jvm.backend.error.change_action_required": "JVM 变更操作不能为空",
+ "jvm.backend.error.change_blocked_by_guard": "当前变更被 Guard 拦截",
+ "jvm.backend.error.change_blocked_read_only": "当前连接为只读,禁止写入",
+ "jvm.backend.error.change_confirmation_token_failed": "生成 JVM 变更确认令牌失败: {{detail}}",
+ "jvm.backend.error.change_reason_required": "JVM 变更原因不能为空",
+ "jvm.backend.error.change_resource_id_required": "JVM 资源 ID 不能为空",
+ "jvm.backend.error.confirmation_token_expired": "确认令牌已过期,请重新预览并确认",
+ "jvm.backend.error.confirmation_token_invalid": "确认令牌无效,请重新预览并确认",
+ "jvm.backend.error.confirmation_token_missing": "缺少确认令牌,请先完成预览确认",
+ "jvm.backend.error.disallowed_mode": "当前连接不允许使用 {{mode}} 模式",
+ "jvm.backend.error.preview_confirmation_missing": "预览确认令牌缺失,请重新预览后再提交",
+ "jvm.backend.error.preview_context_hash_failed": "生成 JVM 预览上下文失败: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "生成 JVM 预览载荷摘要失败: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "JVM 资源路径无效: {{detail}}",
+ "jvm.backend.message.connect_success": "JVM 连接成功",
+ "jvm.backend.monitoring.error.session_not_found": "未找到 {{connectionId}} {{providerMode}} 的 JVM 监控会话",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 监控快照暂未支持",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "监控采样连续失败 {{count}} 次,已自动停止本次监控会话",
+ "jvm.backend.separator.message_warning": ";",
+ "jvm.backend.warning.failed_audit_write_failed": "失败审计写入失败: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "终态审计写入失败: {{detail}}",
"jvm_ai_plan.actions.description": ":{{description}}",
"jvm_ai_plan.actions.field_separator": "、",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "AI 诊断计划:{{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "AI 计划的诊断 transport 为 {{planTransport}},与当前控制台 {{currentTransport}} 不一致,请重新生成计划后再应用。",
"jvm_diagnostic.ai_plan.message.filled": "AI 诊断计划已回填到控制台",
+ "jvm_diagnostic.capability.empty.description": "能力检查只读取通道权限和命令策略,不会创建会话或执行命令。",
+ "jvm_diagnostic.capability.empty.title": "尚未检查能力",
"jvm_diagnostic.capability_result.mutating_allowed": "高风险命令",
"jvm_diagnostic.capability_result.observe_allowed": "观察命令",
"jvm_diagnostic.capability_result.observe_denied": "禁止观察",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "不支持流式",
"jvm_diagnostic.capability_result.title": "能力检查结果",
"jvm_diagnostic.capability_result.trace_allowed": "跟踪命令",
- "jvm_diagnostic.capability.empty.description": "能力检查只读取通道权限和命令策略,不会创建会话或执行命令。",
- "jvm_diagnostic.capability.empty.title": "尚未检查能力",
"jvm_diagnostic.command_input.command_description": "输入 Arthas/诊断命令,例如 thread -n 5、dashboard、jvm;也可以从下方模板一键回填。",
"jvm_diagnostic.command_input.command_label": "诊断命令",
"jvm_diagnostic.command_input.description": "支持自动补全,按 Ctrl/Cmd + Enter 执行",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "手动输入",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "控制台启动会话",
+ "jvm_diagnostic.session.default_title": "JVM 诊断控制台",
"jvm_diagnostic.session_capability.action.clear_output": "清空输出",
"jvm_diagnostic.session_capability.action.refresh_history": "刷新历史",
"jvm_diagnostic.session_capability.description": "当前通道、权限与快捷维护",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "未建会话",
"jvm_diagnostic.session_capability.status.session_established": "会话已建立",
"jvm_diagnostic.session_capability.title": "会话与能力",
- "jvm_diagnostic.session.default_reason": "控制台启动会话",
- "jvm_diagnostic.session.default_title": "JVM 诊断控制台",
"jvm_diagnostic.workbench.action.cancel_command": "取消命令",
"jvm_diagnostic.workbench.action.execute_command": "执行命令",
"jvm_diagnostic.workbench.action.probe": "检查能力",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "资源值",
"jvm_resource.section.supported_actions": "资源支持动作",
"jvm_resource.title": "JVM 资源工作台",
- "jvm.backend.capability.reason.read_only": "当前连接只读",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "请填写完整的 `http://` 或 `https://` 地址,例如 `http://127.0.0.1:19090/gonavi/agent/jvm`。",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 连接失败:Agent Base URL 格式不合法。",
- "jvm.backend.connection_error.agent.base_url_required": "Agent 连接失败:未填写 Agent Base URL。",
- "jvm.backend.connection_error.agent.connection_refused.help": "请确认 Java 服务已通过 `-javaagent` 启动 GoNavi Agent,并检查 Base URL、端口映射和防火墙。",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 连接失败:目标 Agent 管理端口未监听,或当前地址不可达。",
- "jvm.backend.connection_error.agent.forbidden.help": "请确认当前客户端来源、鉴权配置和 Agent 访问策略允许 GoNavi 访问。",
- "jvm.backend.connection_error.agent.forbidden.summary": "Agent 连接失败:当前请求被 Agent 拒绝。",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "请把 Agent Base URL 改成 `http://` 或 `https://` 开头的地址。",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 连接失败:当前只支持 HTTP 或 HTTPS 协议。",
- "jvm.backend.connection_error.agent.timeout.help": "请确认目标地址可达、Agent 已完成启动,并适当增加连接超时时间。",
- "jvm.backend.connection_error.agent.timeout.summary": "Agent 连接失败:访问 Agent 管理端口超时。",
- "jvm.backend.connection_error.agent.unauthorized.help": "请检查连接中的 Agent API Key 是否与目标服务启动参数一致。",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 连接失败:Agent 已响应,但当前 API Key 无效或缺失。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "请填写完整的 `http://` 或 `https://` 地址,并指向实现 GoNavi JVM HTTP 合约的管理接口根路径,例如 `http://127.0.0.1:19090/manage/jvm`。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 连接失败:Endpoint Base URL 格式不合法。",
- "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 连接失败:未填写 Endpoint Base URL。",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "请确认 Base URL 指向实现 GoNavi JVM HTTP 合约的管理接口,并检查服务监听、端口映射和防火墙。",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 连接失败:目标管理接口未监听,或当前地址不可达。",
- "jvm.backend.connection_error.endpoint.forbidden.help": "请确认当前客户端来源、鉴权配置和访问策略允许 GoNavi 访问该管理接口。",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 连接失败:当前请求被目标管理接口拒绝。",
- "jvm.backend.connection_error.endpoint.not_found.help": "请确认 Base URL 指向的是 JVM 管理接口根路径,而不是普通业务接口、健康检查地址或网关首页。",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 连接失败:目标地址已响应,但没有找到 GoNavi JVM 管理接口。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "请把 Endpoint Base URL 改成 `http://` 或 `https://` 开头的地址。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 连接失败:当前只支持 HTTP 或 HTTPS 协议。",
- "jvm.backend.connection_error.endpoint.timeout.help": "请确认 Base URL 可达、目标服务已完成启动,并适当增加连接超时时间。",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 连接失败:访问目标管理接口超时。",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "请检查连接中的 Endpoint API Key 是否与目标服务配置一致。",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 连接失败:目标管理接口已响应,但当前 API Key 无效或缺失。",
- "jvm.backend.connection_error.generic": "JVM 连接失败",
- "jvm.backend.connection_error.jmx.auth.help": "请确认目标 JMX 是否关闭认证;如果必须认证,需要补充用户名/密码后再连接。",
- "jvm.backend.connection_error.jmx.auth.summary": "JMX 连接失败:{{target}} 需要认证,或当前凭据不可用。",
- "jvm.backend.connection_error.jmx.connection_refused.help": "请确认目标 JVM 已开启远程 JMX,并检查主机、防火墙、端口映射和 SSH/代理配置。",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 连接失败:无法连接到 {{target}},对应端口没有监听或当前网络不可达。",
- "jvm.backend.connection_error.jmx.connection_reset.help": "请确认填写的是 JVM 真正对外暴露的 JMX 端口,而不是业务端口、调试端口或被代理转发的端口。",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 连接失败:{{target}} 上的服务主动断开了连接,当前端口不是兼容的标准 JMX RMI 端口。",
- "jvm.backend.connection_error.jmx.host_required": "JMX 连接失败:未填写主机地址。",
- "jvm.backend.connection_error.jmx.java_missing.help": "请先安装 JRE/JDK,或通过环境变量 `GONAVI_JMX_JAVA_BIN` 指向正确的 `java` 可执行文件。",
- "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 连接失败:当前机器未找到 `java` 运行时,GoNavi 无法启动 JMX helper。",
- "jvm.backend.connection_error.jmx.no_such_object.help": "这通常意味着填到了 RMI 注册端口、调试端口或其他 Java 服务端口。请检查 `jmxremote.port` 和 `jmxremote.rmi.port` 配置是否正确。",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 连接失败:{{target}} 上虽然有 RMI 服务,但不是可用的 JMX RMIServer 端口。",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "请改填应用实际暴露的 JMX 端口,而不是业务 `server.port`。如果服务只开启了 `-Dcom.sun.management.jmxremote`,但没有配置 `jmxremote.port`,也无法直接远程连接。",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 连接失败:{{target}} 不是标准 JMX 远程管理端口,当前更像普通业务端口或 HTTP 端口。",
- "jvm.backend.connection_error.jmx.port_invalid": "JMX 连接失败:端口无效,请填写 1-65535 之间的有效端口。",
- "jvm.backend.connection_error.jmx.timeout.help": "请确认端口可达、网络未被拦截,并适当增加连接超时时间。",
- "jvm.backend.connection_error.jmx.timeout.summary": "JMX 连接失败:连接 {{target}} 超时。",
- "jvm.backend.connection_error.suggestion": "建议:{{detail}}",
- "jvm.backend.connection_error.technical_detail": "技术细节:{{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel 地址格式不正确:{{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel 地址不能为空",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "当前 Arthas Tunnel 会话的活动命令与待取消命令不一致",
- "jvm.backend.diagnostic.arthas.command_already_running": "当前 Arthas Tunnel 会话已有命令在执行,请先等待完成或取消",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel 命令已中止",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel 命令执行超时,{{timeout}} 内未完成",
- "jvm.backend.diagnostic.arthas.connect_canceled": "建立 Arthas Tunnel WebSocket 连接已中止",
- "jvm.backend.diagnostic.arthas.connect_failed": "建立 Arthas Tunnel WebSocket 连接失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "建立 Arthas Tunnel WebSocket 连接超时,{{timeout}} 内未收到响应",
- "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 连接已关闭:{{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 连接已关闭:code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 连接尚未建立完成,请稍后重试",
- "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 连接失败:HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "当前 Arthas Tunnel 会话没有正在执行的命令",
- "jvm.backend.diagnostic.arthas.read_canceled": "读取 Arthas Tunnel 输出已中止",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel 读取超时设置失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "读取 Arthas Tunnel 输出失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "读取 Arthas Tunnel 输出超时,{{timeout}} 内未收到响应",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel 请求编码失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel 仅支持 http/https/ws/wss 地址:{{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "向 Arthas Tunnel 发送终端指令已中止",
- "jvm.backend.diagnostic.arthas.send_failed": "向 Arthas Tunnel 发送终端指令失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "向 Arthas Tunnel 发送终端指令超时,{{timeout}} 内未收到响应",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel 会话配置已变化,请重新创建诊断会话",
- "jvm.backend.diagnostic.arthas.session_missing": "诊断会话不存在,请重新创建 Arthas Tunnel 会话",
- "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel 需要填写目标实例标识(targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "找不到目标实例,请确认 targetId / agentId 是否填写正确,且对应 tunnel client 已在线",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "找不到目标实例 {{target}},请确认 targetId / agentId 是否填写正确,且对应 tunnel client 已在线",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 终端指令编码失败:{{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel 写入超时设置失败:{{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "诊断审计记录写入失败,已阻止命令执行: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "取消命令缺少 sessionId 或 commandId",
- "jvm.backend.diagnostic.error.command_required": "诊断命令不能为空",
- "jvm.backend.diagnostic.error.disabled": "当前连接未启用 JVM 诊断增强模式",
- "jvm.backend.diagnostic.error.execute_canceled": "诊断执行请求已中止:{{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "诊断会话 ID 不能为空,请先创建会话",
- "jvm.backend.diagnostic.error.transport_unsupported": "不支持的 JVM 诊断传输模式:{{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas 命令已中止",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas 命令执行完成",
- "jvm.backend.diagnostic.message.cancel_requested": "已发送取消请求,等待诊断桥接端结束命令",
- "jvm.backend.diagnostic.message.command_completed": "诊断命令执行完成",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "诊断命令不支持换行或多命令输入",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "当前连接未开放高风险诊断命令:{{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "当前连接未开放观察类诊断命令:{{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "当前连接为只读模式,仅允许观察类诊断命令",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "当前连接未开放跟踪类诊断命令:{{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "审计记录写入失败: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "审计记录写入失败,已阻止 JVM 变更: {{detail}}",
- "jvm.backend.error.change_action_required": "JVM 变更操作不能为空",
- "jvm.backend.error.change_blocked_by_guard": "当前变更被 Guard 拦截",
- "jvm.backend.error.change_blocked_read_only": "当前连接为只读,禁止写入",
- "jvm.backend.error.change_confirmation_token_failed": "生成 JVM 变更确认令牌失败: {{detail}}",
- "jvm.backend.error.change_reason_required": "JVM 变更原因不能为空",
- "jvm.backend.error.change_resource_id_required": "JVM 资源 ID 不能为空",
- "jvm.backend.error.confirmation_token_expired": "确认令牌已过期,请重新预览并确认",
- "jvm.backend.error.confirmation_token_invalid": "确认令牌无效,请重新预览并确认",
- "jvm.backend.error.confirmation_token_missing": "缺少确认令牌,请先完成预览确认",
- "jvm.backend.error.disallowed_mode": "当前连接不允许使用 {{mode}} 模式",
- "jvm.backend.error.preview_confirmation_missing": "预览确认令牌缺失,请重新预览后再提交",
- "jvm.backend.error.preview_context_hash_failed": "生成 JVM 预览上下文失败: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "生成 JVM 预览载荷摘要失败: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "JVM 资源路径无效: {{detail}}",
- "jvm.backend.message.connect_success": "JVM 连接成功",
- "jvm.backend.monitoring.error.session_not_found": "未找到 {{connectionId}} {{providerMode}} 的 JVM 监控会话",
- "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 监控快照暂未支持",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "监控采样连续失败 {{count}} 次,已自动停止本次监控会话",
- "jvm.backend.separator.message_warning": ";",
- "jvm.backend.warning.failed_audit_write_failed": "失败审计写入失败: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "终态审计写入失败: {{detail}}",
"log_panel.action.clear": "清空日志",
"log_panel.action.close": "关闭面板",
"log_panel.affected_rows": "影响行数:{{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "暂无 SQL 执行日志",
"log_panel.short_title": "日志",
"log_panel.title": "SQL 执行日志",
- "message_publish_modal.action.send": "发送",
- "message_publish_modal.error.build_command_failed": "构造发送命令失败",
- "message_publish_modal.error.send_failed_detail": "发送失败:{{detail}}",
- "message_publish_modal.error.unknown_error": "未知错误",
- "message_publish_modal.field.body_mode.label": "消息体类型",
- "message_publish_modal.field.body.extra": "JSON 模式下需输入合法 JSON;文本模式按原样发送。",
- "message_publish_modal.field.body.label": "消息体",
- "message_publish_modal.field.body.placeholder": "请输入消息体",
- "message_publish_modal.field.body.required": "请输入消息体",
- "message_publish_modal.field.delay_level.extra": "RocketMQ 使用固定延时级别,0 表示立即发送。",
- "message_publish_modal.field.delay_level.label": "Delay Level(可选)",
- "message_publish_modal.field.exchange.extra": "留空使用默认交换机;若填写自定义交换机,请确认目标 Queue 已建立 binding。",
- "message_publish_modal.field.exchange.label": "Exchange(可选)",
- "message_publish_modal.field.exchange.placeholder": "例如:events.topic",
- "message_publish_modal.field.headers.extra": "需为 JSON 对象,例如 {{example}}。",
- "message_publish_modal.field.headers.label": "Headers(可选)",
- "message_publish_modal.field.properties.extra": "需为 JSON 对象,例如 {{example}}。",
- "message_publish_modal.field.properties.label": "Properties(可选)",
- "message_publish_modal.field.qos.extra": "0 为 at most once,1 为 at least once,2 为 exactly once。",
- "message_publish_modal.field.retain.label": "Retain 消息",
- "message_publish_modal.field.routing_key.extra": "留空时默认使用当前 Queue 名。",
- "message_publish_modal.field.routing_key.label": "Routing Key(可选)",
- "message_publish_modal.field.routing_key.placeholder": "例如:orders.queue",
- "message_publish_modal.field.tag.extra": "留空表示不过滤或不写入 Tag。",
- "message_publish_modal.field.tag.label": "Tag(可选)",
- "message_publish_modal.footer.success_prefix": "发送成功后会返回",
- "message_publish_modal.footer.success_suffix": ",用于确认本次测试消息是否已提交。",
- "message_publish_modal.option.no_delay": "不延时",
- "message_publish_modal.option.text": "文本",
- "message_publish_modal.title": "测试发送消息",
- "message_publish_modal.title_with_connection": "测试发送消息 · {{connectionName}}",
"message_publish.error.destination_required": "请输入目标 Topic / Queue",
"message_publish.error.invalid_json_detail": "{{field}}不是合法 JSON:{{detail}}",
"message_publish.error.json_object_required": "{{field}} 必须是 JSON 对象",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag、Keys、Delay Level 与 Properties 会一并写入 RocketMQ 消息属性。",
"message_publish.presentation.rocketmq.tag_placeholder": "例如:TagA",
"message_publish.presentation.topic_required": "请输入 Topic",
+ "message_publish_modal.action.send": "发送",
+ "message_publish_modal.error.build_command_failed": "构造发送命令失败",
+ "message_publish_modal.error.send_failed_detail": "发送失败:{{detail}}",
+ "message_publish_modal.error.unknown_error": "未知错误",
+ "message_publish_modal.field.body.extra": "JSON 模式下需输入合法 JSON;文本模式按原样发送。",
+ "message_publish_modal.field.body.label": "消息体",
+ "message_publish_modal.field.body.placeholder": "请输入消息体",
+ "message_publish_modal.field.body.required": "请输入消息体",
+ "message_publish_modal.field.body_mode.label": "消息体类型",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ 使用固定延时级别,0 表示立即发送。",
+ "message_publish_modal.field.delay_level.label": "Delay Level(可选)",
+ "message_publish_modal.field.exchange.extra": "留空使用默认交换机;若填写自定义交换机,请确认目标 Queue 已建立 binding。",
+ "message_publish_modal.field.exchange.label": "Exchange(可选)",
+ "message_publish_modal.field.exchange.placeholder": "例如:events.topic",
+ "message_publish_modal.field.headers.extra": "需为 JSON 对象,例如 {{example}}。",
+ "message_publish_modal.field.headers.label": "Headers(可选)",
+ "message_publish_modal.field.properties.extra": "需为 JSON 对象,例如 {{example}}。",
+ "message_publish_modal.field.properties.label": "Properties(可选)",
+ "message_publish_modal.field.qos.extra": "0 为 at most once,1 为 at least once,2 为 exactly once。",
+ "message_publish_modal.field.retain.label": "Retain 消息",
+ "message_publish_modal.field.routing_key.extra": "留空时默认使用当前 Queue 名。",
+ "message_publish_modal.field.routing_key.label": "Routing Key(可选)",
+ "message_publish_modal.field.routing_key.placeholder": "例如:orders.queue",
+ "message_publish_modal.field.tag.extra": "留空表示不过滤或不写入 Tag。",
+ "message_publish_modal.field.tag.label": "Tag(可选)",
+ "message_publish_modal.footer.success_prefix": "发送成功后会返回",
+ "message_publish_modal.footer.success_suffix": ",用于确认本次测试消息是否已提交。",
+ "message_publish_modal.option.no_delay": "不延时",
+ "message_publish_modal.option.text": "文本",
+ "message_publish_modal.title": "测试发送消息",
+ "message_publish_modal.title_with_connection": "测试发送消息 · {{connectionName}}",
"proxy.backend.error.host_empty": "代理主机为空",
"proxy.backend.error.http_connect_failed": "连接 HTTP 代理失败:{{detail}}",
"proxy.backend.error.http_connect_read_failed": "读取 HTTP CONNECT 响应失败:{{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "SOCKS5 代理连接失败:{{detail}}",
"proxy.backend.error.socks5_dialer_failed": "创建 SOCKS5 代理拨号器失败:{{detail}}",
"proxy.backend.error.unsupported_type": "不支持的代理类型:{{type}}",
+ "query.format": "美化 SQL",
+ "query.new": "新建查询",
+ "query.run": "运行",
+ "query.save": "保存查询",
+ "query.stop": "停止",
"query_editor.action.ai_explain_sql": "AI 解释 SQL",
"query_editor.action.ai_explain_sql_menu": "解释 SQL",
"query_editor.action.ai_generate_sql": "AI 生成 SQL",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "Schema 分析",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "导出 SQL 文件",
- "query_editor.action.format": "美化",
"query_editor.action.find_in_editor": "搜索",
"query_editor.action.find_in_editor_with_shortcut": "编辑器内搜索({{shortcut}})",
+ "query_editor.action.format": "美化",
"query_editor.action.format_sql": "美化 SQL",
"query_editor.action.format_sql_with_shortcut": "美化 SQL({{shortcut}})",
"query_editor.action.hide_results_panel": "隐藏结果区",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "最大行数:5000",
"query_editor.max_rows.option_unlimited": "最大行数:不限",
"query_editor.max_rows.tooltip": "最大返回行数。会对 SELECT 自动加 LIMIT,防止大结果集卡死界面。",
+ "query_editor.message.ai_model_missing": "当前 AI Provider 未选择模型,请先在 AI 设置中选择模型。",
+ "query_editor.message.ai_provider_missing": "请先在 AI 设置中配置并启用 AI Provider。",
+ "query_editor.message.ai_service_unavailable": "AI 服务尚未就绪,请稍后重试或检查 AI 设置。",
"query_editor.message.append_success": "代码已追加。",
"query_editor.message.cancel_failed": "取消查询失败:{{error}}",
"query_editor.message.cancel_no_running": "没有正在运行的查询可取消。",
"query_editor.message.cancel_success": "查询已中止。",
"query_editor.message.connection_not_found": "未找到连接。",
"query_editor.message.connection_readonly_blocked": "当前连接已启用生产保护,仅允许执行查询操作。",
+ "query_editor.message.current_line_no_copyable_content": "当前行没有可复制内容。",
"query_editor.message.execution_failed_with_error": "查询执行失败:{{error}}",
"query_editor.message.execution_multi_success": "已执行 {{statements}} 条语句,生成 {{results}} 个结果集。",
"query_editor.message.execution_result_sets_success": "已执行完成,生成 {{results}} 个结果集。",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "格式化失败:SQL 语法可能有误。",
"query_editor.message.format_restore_success": "已还原到美化前 SQL",
"query_editor.message.insert_success": "代码已在当前光标处成功插入。",
- "query_editor.message.ai_model_missing": "当前 AI Provider 未选择模型,请先在 AI 设置中选择模型。",
- "query_editor.message.ai_provider_missing": "请先在 AI 设置中配置并启用 AI Provider。",
- "query_editor.message.ai_service_unavailable": "AI 服务尚未就绪,请稍后重试或检查 AI 设置。",
"query_editor.message.no_executable_sql": "没有可执行的 SQL。",
"query_editor.message.no_format_restore_snapshot": "没有可还原的美化前 SQL",
- "query_editor.message.current_line_no_copyable_content": "当前行没有可复制内容。",
"query_editor.message.no_selectable_sql": "没有可选择的 SQL 语句。",
"query_editor.message.object_info_target_not_found": "当前光标未定位到可识别的表或字段。",
"query_editor.message.page_query_empty": "翻页未返回结果集",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "结果 {{index}} ✓",
"query_editor.results_panel.action.hide": "隐藏",
"query_editor.results_panel.aria.hide": "隐藏结果区",
+ "query_editor.results_panel.detached.close": "关闭窗口",
+ "query_editor.results_panel.detached.restore": "还原为结果标签",
+ "query_editor.results_panel.detached.title": "结果 {{index}}",
"query_editor.results_panel.menu.close_all": "关闭所有",
"query_editor.results_panel.menu.close_left": "关闭左侧",
"query_editor.results_panel.menu.close_other": "关闭其他页",
"query_editor.results_panel.menu.close_right": "关闭右侧",
+ "query_editor.results_panel.menu.open_in_window": "在独立窗口打开",
+ "query_editor.results_panel.menu.restore_to_tab": "还原为结果标签",
"query_editor.results_panel.message.action.copy": "复制",
"query_editor.results_panel.message.copy_failed": "复制消息失败:{{detail}}",
"query_editor.results_panel.message.copy_unsupported": "当前环境不支持复制到剪贴板",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "重命名查询",
"query_editor.save_modal.title": "保存查询",
"query_editor.save_modal.unnamed": "未命名查询",
- "query_editor.snippet_picker.description": "选择一个已有 SQL 片段并插入到当前光标位置。",
- "query_editor.snippet_picker.empty": "当前还没有可用的 SQL 片段,可前往片段管理新增或恢复默认片段。",
- "query_editor.snippet_picker.empty_filtered": "未找到匹配的 SQL 片段。",
- "query_editor.snippet_picker.manage": "管理片段",
- "query_editor.snippet_picker.search_placeholder": "搜索前缀、名称或内容",
- "query_editor.snippet_picker.title": "插入 SQL 片段",
"query_editor.slash_command.diff.description": "对比两表差异生成变更",
"query_editor.slash_command.diff.label": "表对比",
"query_editor.slash_command.diff.prompt": "请对比以下两张表的结构差异,并生成从旧版本迁移到新版本的 ALTER 语句。",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "描述需求自动生成语句",
"query_editor.slash_command.sql.label": "生成 SQL",
"query_editor.slash_command.sql.prompt": "请根据以下需求生成 SQL:",
- "query_editor.text_to_sql.description": "描述你想查询或处理的数据,GoNavi 会结合当前连接、库和已加载表结构生成 SQL。",
- "query_editor.text_to_sql.generate": "生成 SQL",
- "query_editor.text_to_sql.mode.insert": "插入到光标",
- "query_editor.text_to_sql.mode.replace_all": "替换全文",
- "query_editor.text_to_sql.mode.replace_selection": "替换选区",
- "query_editor.text_to_sql.placeholder": "例如:统计最近 30 天每天的订单金额,并按日期升序返回",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "选择一个已有 SQL 片段并插入到当前光标位置。",
+ "query_editor.snippet_picker.empty": "当前还没有可用的 SQL 片段,可前往片段管理新增或恢复默认片段。",
+ "query_editor.snippet_picker.empty_filtered": "未找到匹配的 SQL 片段。",
+ "query_editor.snippet_picker.manage": "管理片段",
+ "query_editor.snippet_picker.search_placeholder": "搜索前缀、名称或内容",
+ "query_editor.snippet_picker.title": "插入 SQL 片段",
"query_editor.sql_error.rule.column_missing.explanation": "SQL 引用了结果集中不存在、拼写不一致或当前表没有的字段。",
"query_editor.sql_error.rule.column_missing.label": "字段不存在",
"query_editor.sql_error.rule.column_missing.suggestion": "检查字段名、别名、大小写、引用表别名,以及字段是否属于当前 FROM/JOIN 的对象。",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "原始错误:{{error}}",
"query_editor.sql_error.wrapper.semantic_line": "中文语义:{{label}}。{{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "处理建议:{{suggestion}}",
+ "query_editor.text_to_sql.description": "描述你想查询或处理的数据,GoNavi 会结合当前连接、库和已加载表结构生成 SQL。",
+ "query_editor.text_to_sql.generate": "生成 SQL",
+ "query_editor.text_to_sql.mode.insert": "插入到光标",
+ "query_editor.text_to_sql.mode.replace_all": "替换全文",
+ "query_editor.text_to_sql.mode.replace_selection": "替换选区",
+ "query_editor.text_to_sql.placeholder": "例如:统计最近 30 天每天的订单金额,并按日期升序返回",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "提交",
"query_editor.transaction.action.commit_with_count": "提交 ({{count}})",
"query_editor.transaction.action.rollback": "回滚",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "无法解析连接指纹",
"query_history.backend.message.cleared": "已清空慢查询历史",
"query_history.backend.message.loaded": "加载完成",
- "query.format": "美化 SQL",
- "query.new": "新建查询",
- "query.run": "运行",
- "query.save": "保存查询",
- "query.stop": "停止",
+ "redis.backend.error.address_required": "Redis 连接地址不能为空",
+ "redis.backend.error.argument_invalid_type": "{{name}} 类型无效",
+ "redis.backend.error.argument_required": "{{name}} 不能为空",
+ "redis.backend.error.cluster_connect_failed": "Redis 集群连接失败:{{detail}}",
+ "redis.backend.error.command_required": "命令不能为空",
+ "redis.backend.error.connect_attempt_failed": "第{{attempt}}次连接失败:{{detail}}",
+ "redis.backend.error.connect_failed": "Redis 连接失败:{{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "第{{attempt}}次 TLS 配置失败:{{detail}}",
+ "redis.backend.error.export_no_keys": "没有可导出的 Key",
+ "redis.backend.error.import_no_keys_selected": "未选择要导入的 Key",
+ "redis.backend.error.import_payload_invalid": "Redis 导入文件无效:{{detail}}",
+ "redis.backend.error.invalid_node_address": "无效 Redis 节点地址:{{address}}",
+ "redis.backend.error.invalid_port": "无效 Redis 端口:{{address}}",
+ "redis.backend.error.node_address_required": "Redis 节点地址不能为空",
+ "redis.backend.error.select_db_index_invalid": "无效数据库索引:{{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "数据库索引必须在 {{min}}-{{max}} 之间",
+ "redis.backend.error.select_db_index_required": "SELECT 命令需要提供数据库索引",
+ "redis.backend.error.sentinel_connect_failed": "Redis Sentinel 连接失败:{{detail}}",
+ "redis.backend.error.sentinel_master_required": "Redis Sentinel 模式需要填写 master 名称",
+ "redis.backend.error.ssh_tunnel_create_failed": "创建 SSH 隧道失败:{{detail}}",
+ "redis.backend.error.test_connection_close_failed": "连接成功,但释放测试连接失败:{{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}}模式暂不支持 SSH 隧道,请关闭 SSH 后重试",
+ "redis.backend.label.topology_cluster": "集群",
+ "redis.backend.label.topology_multi_node": "多节点",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "添加成功",
+ "redis.backend.message.connect_success": "连接成功",
+ "redis.backend.message.delete_success": "删除成功",
+ "redis.backend.message.export_success": "导出成功",
+ "redis.backend.message.flush_success": "清空成功",
+ "redis.backend.message.import_success": "导入成功",
+ "redis.backend.message.rename_success": "重命名成功",
+ "redis.backend.message.select_db_success": "切换成功",
+ "redis.backend.message.set_success": "设置成功",
+ "redis.db_alias.menu.set": "设置别名",
+ "redis.db_alias.modal.placeholder": "例如:缓存、会话(留空则清除)",
+ "redis.db_alias.modal.title": "{{db}} 的别名",
"redis_command.action.clear_console": "清空控制台",
"redis_command.action.execute": "运行(Cmd+Enter)",
"redis_command.completion.detail": "Redis 命令",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "推入尾部",
"redis_viewer.action.add_member": "新增成员",
"redis_viewer.action.add_stream_entry": "新增条目",
+ "redis_viewer.action.change_import_file": "更换导入文件",
"redis_viewer.action.clear_group_selection": "清除选择",
"redis_viewer.action.clear_selection": "清除选择",
"redis_viewer.action.copy": "复制",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "编辑",
"redis_viewer.action.export_all": "导出全部",
"redis_viewer.action.export_selected": "导出已选",
- "redis_viewer.action.change_import_file": "更换导入文件",
"redis_viewer.action.import": "导入",
"redis_viewer.action.load_all": "加载全部",
"redis_viewer.action.load_more": "加载更多",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "刷新",
"redis_viewer.action.rename_key": "重命名 Key",
"redis_viewer.action.select_all_import_keys": "全选导入项",
- "redis_viewer.action.select_import_file": "选择导入文件",
"redis_viewer.action.select_all_loaded": "全选已加载",
"redis_viewer.action.select_group": "选择",
+ "redis_viewer.action.select_import_file": "选择导入文件",
"redis_viewer.action.set_ttl": "设置 TTL",
"redis_viewer.aria.collapse_group": "折叠分组",
"redis_viewer.aria.expand_group": "展开分组",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "二进制数据无法编辑",
"redis_viewer.hint.switch_auto_to_edit": "切换到 Auto 模式后编辑",
"redis_viewer.label.encoding": "编码:{{encoding}}",
+ "redis_viewer.label.import_database": "来源库:db{{database}}",
+ "redis_viewer.label.import_selection": "已选择 {{selected}} / {{total}} 个 Key",
"redis_viewer.label.keys_count": "已加载 {{count}} 个 Key",
"redis_viewer.label.length": "长度:{{count}}",
"redis_viewer.label.node_count": "{{count}} 个节点",
- "redis_viewer.label.import_database": "来源库:db{{database}}",
- "redis_viewer.label.import_selection": "已选择 {{selected}} / {{total}} 个 Key",
"redis_viewer.label.original_key": "原 Key:{{key}}",
"redis_viewer.message.add_failed": "新增失败:{{detail}}",
"redis_viewer.message.add_success": "已新增",
@@ -6602,9 +6644,9 @@
"redis_viewer.modal.rename_key": "重命名 Key",
"redis_viewer.modal.set_ttl": "设置 TTL",
"redis_viewer.modal.update_score": "更新分数",
+ "redis_viewer.notice.large_keyspace_mode": "大 Keyspace 性能模式已启用。节点渲染已简化,最多保留 {{count}} 个展开分组。",
"redis_viewer.option.import_overwrite": "覆盖已存在 Key",
"redis_viewer.option.import_skip_existing": "跳过已存在 Key",
- "redis_viewer.notice.large_keyspace_mode": "大 Keyspace 性能模式已启用。节点渲染已简化,最多保留 {{count}} 个展开分组。",
"redis_viewer.placeholder.key_name": "Key 名称",
"redis_viewer.placeholder.member_value": "输入成员值",
"redis_viewer.placeholder.new_element_value": "输入新元素值",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "原始文本",
"redis_viewer.view.title": "查看模式",
- "redis.backend.error.address_required": "Redis 连接地址不能为空",
- "redis.backend.error.argument_invalid_type": "{{name}} 类型无效",
- "redis.backend.error.argument_required": "{{name}} 不能为空",
- "redis.backend.error.cluster_connect_failed": "Redis 集群连接失败:{{detail}}",
- "redis.backend.error.command_required": "命令不能为空",
- "redis.backend.error.connect_attempt_failed": "第{{attempt}}次连接失败:{{detail}}",
- "redis.backend.error.connect_failed": "Redis 连接失败:{{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "第{{attempt}}次 TLS 配置失败:{{detail}}",
- "redis.backend.error.export_no_keys": "没有可导出的 Key",
- "redis.backend.error.import_no_keys_selected": "未选择要导入的 Key",
- "redis.backend.error.import_payload_invalid": "Redis 导入文件无效:{{detail}}",
- "redis.backend.error.invalid_node_address": "无效 Redis 节点地址:{{address}}",
- "redis.backend.error.invalid_port": "无效 Redis 端口:{{address}}",
- "redis.backend.error.node_address_required": "Redis 节点地址不能为空",
- "redis.backend.error.select_db_index_invalid": "无效数据库索引:{{value}}",
- "redis.backend.error.select_db_index_out_of_range": "数据库索引必须在 {{min}}-{{max}} 之间",
- "redis.backend.error.select_db_index_required": "SELECT 命令需要提供数据库索引",
- "redis.backend.error.sentinel_connect_failed": "Redis Sentinel 连接失败:{{detail}}",
- "redis.backend.error.sentinel_master_required": "Redis Sentinel 模式需要填写 master 名称",
- "redis.backend.error.ssh_tunnel_create_failed": "创建 SSH 隧道失败:{{detail}}",
- "redis.backend.error.test_connection_close_failed": "连接成功,但释放测试连接失败:{{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}}模式暂不支持 SSH 隧道,请关闭 SSH 后重试",
- "redis.backend.label.topology_cluster": "集群",
- "redis.backend.label.topology_multi_node": "多节点",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "添加成功",
- "redis.backend.message.connect_success": "连接成功",
- "redis.backend.message.delete_success": "删除成功",
- "redis.backend.message.export_success": "导出成功",
- "redis.backend.message.flush_success": "清空成功",
- "redis.backend.message.import_success": "导入成功",
- "redis.backend.message.rename_success": "重命名成功",
- "redis.backend.message.select_db_success": "切换成功",
- "redis.backend.message.set_success": "设置成功",
- "redis.db_alias.menu.set": "设置别名",
- "redis.db_alias.modal.placeholder": "例如:缓存、会话(留空则清除)",
- "redis.db_alias.modal.title": "{{db}} 的别名",
"saved_query.default_name": "查询-{{index}}",
"saved_query.error.missing_context": "保存查询缺少 SQL、连接或数据库上下文",
"security_update.action.open_ai_settings": "AI 设置",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "请基于数据表 {{table}} 生成 3 条常用查询 SQL。",
"sidebar.aria.switch_connection": "切换到连接 {{name}}",
"sidebar.badge.recommended": "推荐",
- "sidebar.batch_databases": "数据库",
- "sidebar.batch_tables": "表",
"sidebar.batch.filtered_count": "已筛选 {{filtered}} / {{total}} 个对象",
"sidebar.batch.group.tables": "表",
"sidebar.batch.group.views": "视图",
"sidebar.batch.no_matching_objects": "无匹配对象",
"sidebar.batch.selected_databases": "已选择 {{selected}} / {{total}} 个数据库",
"sidebar.batch.selected_objects": "已选择 {{selected}} / {{total}} 个对象",
+ "sidebar.batch_databases": "数据库",
+ "sidebar.batch_tables": "表",
"sidebar.command_search.action.ask_ai.title": "让 AI 回答",
"sidebar.command_search.action.new_connection.meta": "创建数据库、运行时或其他数据源连接",
"sidebar.command_search.action.new_connection.title": "新建数据源",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "表名",
"sidebar.copy_object_name.label.view": "视图名称",
"sidebar.error.unknown": "未知错误",
+ "sidebar.external_sql.directory_fallback": "SQL 目录",
+ "sidebar.external_sql.root": "外部 SQL 文件",
"sidebar.external_sql_modal.action.create": "新建",
"sidebar.external_sql_modal.action.rename": "重命名",
"sidebar.external_sql_modal.field.directory_name": "目录名",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "请输入目录名",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "文件名不能包含路径分隔符",
"sidebar.external_sql_modal.validation.sql_file_name_required": "请输入 SQL 文件名",
- "sidebar.external_sql.directory_fallback": "SQL 目录",
- "sidebar.external_sql.root": "外部 SQL 文件",
"sidebar.field.database_name": "数据库名称",
"sidebar.field.new_database_name": "新数据库名称",
"sidebar.field.new_table_name": "新表名",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "请至少选择一个数据库。",
"sidebar.message.select_host_before_large_sql_file": "请先选择一个 Host 后再执行大 SQL 文件。",
"sidebar.message.select_object_required": "请至少选择一个对象。",
- "sidebar.message.select_table_required": "请至少选择一张表。",
"sidebar.message.select_sql_directory_failed": "选择 SQL 目录失败:{{error}}",
+ "sidebar.message.select_table_required": "请至少选择一张表。",
"sidebar.message.sidebar_filter_reset": "已重置侧栏筛选。",
"sidebar.message.sidebar_filter_sync_disabled": "已关闭左侧筛选同步。",
"sidebar.message.sidebar_filter_sync_enabled": "已开启左侧筛选同步。",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "批量操作表",
"sidebar.modal.confirm_clear_selected_tables.content": "清空 {{connection}} / {{database}} 下已选对象的数据?此操作不可撤销。",
"sidebar.modal.confirm_clear_selected_tables.title": "确认清空已选表",
- "sidebar.modal.confirm_delete_selected_databases.content": "删除 {{connection}} 下 {{count}} 个已选库?此操作不可撤销。",
- "sidebar.modal.confirm_delete_selected_databases.title": "确认删除已选库",
- "sidebar.modal.confirm_delete_selected_tables.content": "删除 {{connection}} / {{database}} 下 {{count}} 张已选表?此操作不可撤销。",
- "sidebar.modal.confirm_delete_selected_tables.title": "确认删除已选表",
+ "sidebar.modal.confirm_delete.title": "确认删除",
"sidebar.modal.confirm_delete_connection.content": "删除连接 {{name}}?",
"sidebar.modal.confirm_delete_database.content": "删除 {{name}}?此操作不可撤销。",
"sidebar.modal.confirm_delete_database.title": "删除数据库",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "确定要删除已保存的查询 \"{{name}}\" 吗?此操作不可恢复。",
"sidebar.modal.confirm_delete_schema.content": "删除模式 {{name}}?该模式及其中所有对象都会被删除,此操作不可撤销。",
"sidebar.modal.confirm_delete_schema.title": "删除模式",
+ "sidebar.modal.confirm_delete_selected_databases.content": "删除 {{connection}} 下 {{count}} 个已选库?此操作不可撤销。",
+ "sidebar.modal.confirm_delete_selected_databases.title": "确认删除已选库",
+ "sidebar.modal.confirm_delete_selected_tables.content": "删除 {{connection}} / {{database}} 下 {{count}} 张已选表?此操作不可撤销。",
+ "sidebar.modal.confirm_delete_selected_tables.title": "确认删除已选表",
"sidebar.modal.confirm_delete_sql_directory.content": "删除 \"{{name}}\"?此操作会删除本地磁盘目录,且仅支持删除空目录。",
"sidebar.modal.confirm_delete_sql_directory.title": "删除 SQL 目录",
"sidebar.modal.confirm_delete_sql_file.content": "删除 \"{{name}}\"?此操作会删除本地磁盘文件,无法恢复。",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "确定要删除分组 \"{{name}}\" 吗?这不会删除其中的连接。",
"sidebar.modal.confirm_delete_view.content": "删除 {{name}}?此操作不可撤销。",
"sidebar.modal.confirm_delete_view.title": "删除视图",
- "sidebar.modal.confirm_delete.title": "确认删除",
"sidebar.modal.confirm_table_data_action.content": "{{action}} {{table}}?此操作不可撤销。",
"sidebar.modal.confirm_table_data_action.title": "确认 {{action}}",
"sidebar.modal.create_database.title": "创建数据库",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "新建分组",
"sidebar.modal.tag.edit_description": "更新分组名称和包含的连接。",
"sidebar.modal.tag.edit_title": "编辑分组",
+ "sidebar.object.function": "函数",
+ "sidebar.object.procedure": "存储过程",
+ "sidebar.object.view": "视图",
"sidebar.object_group.events": "事件",
"sidebar.object_group.materialized_views": "物化视图",
"sidebar.object_group.packages": "存储包",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "表",
"sidebar.object_group.triggers": "触发器",
"sidebar.object_group.views": "视图",
- "sidebar.object.function": "函数",
- "sidebar.object.procedure": "存储过程",
- "sidebar.object.view": "视图",
"sidebar.placeholder.filter_table_view": "筛选表或视图",
"sidebar.placeholder.select_connection": "请选择连接",
"sidebar.placeholder.select_connection_first": "请先选择连接",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "手动范围",
"sidebar.search.multi_select_supported": "支持多选",
"sidebar.search.placeholder": "搜索...",
- "sidebar.search.scope_description": "选择侧边栏搜索的匹配范围。",
- "sidebar.search.scope_hint": "智能模式会根据上下文搜索名称、主机、数据库和对象。",
- "sidebar.search.scope_title": "搜索范围",
- "sidebar.search.scope_tooltip": "当前搜索范围:{{scope}}",
"sidebar.search.scope.database": "数据库",
"sidebar.search.scope.host": "主机",
"sidebar.search.scope.object": "对象",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "根据当前选中的节点自动缩小搜索范围。",
"sidebar.search.scope.smart_short": "智能",
"sidebar.search.scope.tag": "标签",
+ "sidebar.search.scope_description": "选择侧边栏搜索的匹配范围。",
+ "sidebar.search.scope_hint": "智能模式会根据上下文搜索名称、主机、数据库和对象。",
+ "sidebar.search.scope_title": "搜索范围",
+ "sidebar.search.scope_tooltip": "当前搜索范围:{{scope}}",
"sidebar.sql_directory.default_name": "SQL 目录",
+ "sidebar.sql_file.default_name": "SQL 文件",
"sidebar.sql_file_exec.cancel": "取消执行",
"sidebar.sql_file_exec.executed_label": "已执行:",
"sidebar.sql_file_exec.file_size": "文件大小:",
+ "sidebar.sql_file_exec.message.already_running": "当前已有外部 SQL 执行任务在运行",
"sidebar.sql_file_exec.rows_separator": " 行 | 失败:",
"sidebar.sql_file_exec.rows_suffix": " 行",
- "sidebar.sql_file_exec.status_label": "状态:",
"sidebar.sql_file_exec.status.cancelled": "已中止",
"sidebar.sql_file_exec.status.done": "完成",
"sidebar.sql_file_exec.status.error": "错误",
"sidebar.sql_file_exec.status.running": "运行中",
+ "sidebar.sql_file_exec.status_label": "状态:",
"sidebar.sql_file_exec.title": "运行外部 SQL 文件",
- "sidebar.sql_file_exec.message.already_running": "当前已有外部 SQL 执行任务在运行",
"sidebar.sql_file_exec.workbench.action.clear_history": "清空历史",
"sidebar.sql_file_exec.workbench.action.run_again": "重新执行",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "当前还没有运行任务,选择文件后会在这里持续展示执行进度。",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "开始时间",
"sidebar.sql_file_exec.workbench.section.config": "执行配置",
"sidebar.sql_file_exec.workbench.stage.preparing": "准备执行",
- "sidebar.sql_file.default_name": "SQL 文件",
"sidebar.sql_template.duckdb_macro_hint": "使用 SQL Macro 实现类似函数的行为",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB 暂不支持存储过程",
"sidebar.sql_template.edit_routine": "编辑 {{type}} {{name}}",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "导出当前模式表结构 · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · 模式操作",
"sidebar.v2_table_group_menu.current_database": "当前数据库",
- "sidebar.v2_table_group_menu.display_section": "显示",
"sidebar.v2_table_group_menu.display_create_time": "显示创建时间",
+ "sidebar.v2_table_group_menu.display_section": "显示",
"sidebar.v2_table_group_menu.display_table_rows": "显示表行数",
"sidebar.v2_table_group_menu.display_table_size": "显示表大小",
"sidebar.v2_table_group_menu.display_update_time": "显示修改时间",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "诊断仅支持 SELECT / WITH 查询;写操作请使用 EXPLAIN PLAN 模式(PR2 支持)",
"sql_analysis.backend.error.unsupported_db_type": "当前数据源({{dbType}})暂不支持 SQL 诊断;一期支持 MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase",
"sql_analysis.backend.message.completed": "诊断完成",
- "sql_analysis.explain_graph.flag.filesort": "额外排序",
- "sql_analysis.explain_graph.flag.full_scan": "全表扫描",
- "sql_analysis.explain_graph.flag.temp_table": "临时表",
- "sql_analysis.explain_graph.label.index": "索引:",
- "sql_analysis.explain_graph.label.table": "表:",
- "sql_analysis.explain_graph.metric.actual_rows": "实际",
- "sql_analysis.explain_graph.metric.cost": "成本",
- "sql_analysis.explain_graph.metric.est_rows": "估算",
"sql_analysis.explain.empty": "输入 SQL 后运行诊断",
"sql_analysis.explain.error.query_required": "查询语句为空",
"sql_analysis.explain.error.run_failed": "诊断失败",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(无原文)",
"sql_analysis.explain.view.plan": "执行计划",
"sql_analysis.explain.view.raw": "原文",
+ "sql_analysis.explain_graph.flag.filesort": "额外排序",
+ "sql_analysis.explain_graph.flag.full_scan": "全表扫描",
+ "sql_analysis.explain_graph.flag.temp_table": "临时表",
+ "sql_analysis.explain_graph.label.index": "索引:",
+ "sql_analysis.explain_graph.label.table": "表:",
+ "sql_analysis.explain_graph.metric.actual_rows": "实际",
+ "sql_analysis.explain_graph.metric.cost": "成本",
+ "sql_analysis.explain_graph.metric.est_rows": "估算",
"sql_analysis.sidebar.node.actual_rows": "实际行数",
"sql_analysis.sidebar.node.buffer_hit": "缓冲命中",
"sql_analysis.sidebar.node.cost": "成本",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "标签-{{index}}",
"store.fallback.sql_snippet_name": "片段-{{index}}",
"tab_manager.close_aria": "关闭 {{title}}",
+ "tab_manager.detached.close": "关闭窗口",
+ "tab_manager.detached.restore": "还原为标签页",
+ "tab_manager.detached.title_fallback": "独立窗口",
"tab_manager.empty.action.open_ai": "打开 AI",
"tab_manager.empty.aria.start_workbench": "GoNavi 起始工作台",
"tab_manager.empty.eyebrow.connections": "{{count}} 个连接",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "关闭左侧页",
"tab_manager.menu.close_other": "关闭其他页",
"tab_manager.menu.close_right": "关闭右侧页",
+ "tab_manager.menu.open_in_window": "在独立窗口打开",
+ "tab_manager.menu.restore_to_tab": "还原为标签页",
"tab_manager.menu.tab_display_settings": "标签设置",
"tab_manager.sql_file_close.close_tabs": "关闭标签",
"tab_manager.sql_file_close.continue_close": "继续关闭",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "初始化信息已失效,请刷新页面后重试",
"web_auth.error.setup_required": "需要先完成浏览器访问认证初始化",
"web_auth.error.setup_token_expired": "初始化令牌已过期,请刷新页面后重试",
- "web_auth.error.totp_code_required": "请输入 Google Authenticator 验证码或恢复码",
"web_auth.error.too_many_login_attempts": "登录失败次数过多,请稍后再试",
+ "web_auth.error.totp_code_required": "请输入 Google Authenticator 验证码或恢复码",
"web_auth.page.login.code_label": "Google Authenticator 验证码 / 恢复码",
"web_auth.page.login.code_placeholder": "6 位验证码或恢复码",
"web_auth.page.login.description": "浏览器访问版默认使用服务端会话。未操作超时、绝对超时与记住登录时长由服务端统一控制。",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "恢复码仅显示这一次,建议离线保存:",
"web_auth.page.setup.remember_label": "记住登录(天)",
"web_auth.page.setup.secret_label": "密钥",
+ "web_auth.page.setup.session_title": "会话策略",
"web_auth.page.setup.step_admin_description": "先完成浏览器访问口令",
"web_auth.page.setup.step_admin_hint": "先设置管理员密码,并决定是否启用 Google Authenticator 2FA。",
"web_auth.page.setup.step_admin_title": "创建管理员密码",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "扫码或手动录入 TOTP",
"web_auth.page.setup.step_totp_hint": "如果启用了 2FA,请在这里完成扫码绑定,并输入首个验证码确认配置。",
"web_auth.page.setup.step_totp_title": "绑定验证器",
- "web_auth.page.setup.session_title": "会话策略",
"web_auth.page.setup.submit": "完成初始化并进入 GoNavi",
"web_auth.page.setup.subtitle": "首次启动需要创建管理员密码,并建议立即绑定 Google Authenticator",
"web_auth.page.setup.title": "初始化 GoNavi Web",
diff --git a/shared/i18n/zh-TW.json b/shared/i18n/zh-TW.json
index 17fe7d6e..789065b5 100644
--- a/shared/i18n/zh-TW.json
+++ b/shared/i18n/zh-TW.json
@@ -1,4 +1,30 @@
{
+ "ai.service.mcp_client.claude_code.config_dir_create_failed": "建立 Claude Code 設定目錄失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 設定格式異常:{{path}} 應為 {{expected}}",
+ "ai.service.mcp_client.claude_code.config_parse_failed": "解析 Claude Code 設定失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_path_failed": "定位 Claude Code 設定失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_read_failed": "讀取 Claude Code 設定失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_serialize_failed": "序列化 Claude Code 設定失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.config_write_failed": "寫入 Claude Code 設定失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.install_success": "已寫入 Claude Code 使用者層級 MCP 設定,重新啟動 Claude CLI 後可在 /mcp 的 User MCPs 中看到 GoNavi。",
+ "ai.service.mcp_client.claude_code.status.connected": "已偵測到 Claude Code 使用者層級 GoNavi MCP 設定,且與目前 GoNavi 安裝路徑一致",
+ "ai.service.mcp_client.claude_code.status.missing": "未偵測到 Claude Code 使用者層級 GoNavi MCP 設定",
+ "ai.service.mcp_client.claude_code.status.path_check_failed": "已偵測到 Claude Code 中的 GoNavi MCP 記錄,但目前 GoNavi 安裝路徑校驗失敗:{{detail}}",
+ "ai.service.mcp_client.claude_code.status.path_mismatch": "已偵測到 Claude Code 中的 GoNavi MCP 記錄,但與目前 GoNavi 安裝路徑不一致,建議更新",
+ "ai.service.mcp_client.codex.config_dir_create_failed": "建立 Codex 設定目錄失敗:{{detail}}",
+ "ai.service.mcp_client.codex.config_format_invalid": "Codex 設定格式異常:{{path}} 無法按 {{expected}} 解析",
+ "ai.service.mcp_client.codex.config_path_failed": "定位 Codex 設定失敗:{{detail}}",
+ "ai.service.mcp_client.codex.config_read_failed": "讀取 Codex 設定失敗:{{detail}}",
+ "ai.service.mcp_client.codex.config_write_failed": "寫入 Codex 設定失敗:{{detail}}",
+ "ai.service.mcp_client.codex.install_success": "已寫入 Codex 使用者層級 MCP 設定,重新啟動 Codex CLI 或桌面端後可看到 GoNavi。",
+ "ai.service.mcp_client.codex.status.connected": "已偵測到 Codex 使用者層級 GoNavi MCP 設定,且與目前 GoNavi 安裝路徑一致",
+ "ai.service.mcp_client.codex.status.missing": "未偵測到 Codex 使用者層級 GoNavi MCP 設定",
+ "ai.service.mcp_client.codex.status.path_check_failed": "已偵測到 Codex 中的 GoNavi MCP 記錄,但目前 GoNavi 安裝路徑校驗失敗:{{detail}}",
+ "ai.service.mcp_client.codex.status.path_mismatch": "已偵測到 Codex 中的 GoNavi MCP 記錄,但與目前 GoNavi 安裝路徑不一致,建議更新",
+ "ai.service.mcp_client.executable_path_empty": "目前 GoNavi 可執行檔路徑為空",
+ "ai.service.mcp_client.executable_path_failed": "定位目前 GoNavi 可執行檔失敗:{{detail}}",
+ "ai.service.mcp_client.remote.status.message": "{{label}} 通常部署在雲端或遠端環境;請透過遠端 MCP 橋接接入 Windows GoNavi,資料庫密碼仍保存在 GoNavi 本機。",
+ "ai.service.mcp_client.user_home_dir_unavailable": "無法判定目前使用者目錄",
"ai_chat.builtin_tools.database.execute_sql.desc": "执行 SQL 查询并返回结果",
"ai_chat.builtin_tools.database.execute_sql.detail": "传入 connectionId、dbName 和 sql,在目标数据库上执行 SQL 并返回结果(最多 50 行)。受安全级别控制,只读模式下仅允许 SELECT/SHOW/DESCRIBE。",
"ai_chat.builtin_tools.database.execute_sql.parameters.connectionId.description": "连接ID",
@@ -189,10 +215,10 @@
"ai_chat.header.default_session_title": "新對話",
"ai_chat.header.export_time": "匯出時間:",
"ai_chat.header.export_user": "你",
- "ai_chat.header.mode_tabs.aria_label": "AI 工作模式",
"ai_chat.header.mode.chat": "對話",
"ai_chat.header.mode.history": "歷史",
"ai_chat.header.mode.insights": "自動洞察",
+ "ai_chat.header.mode_tabs.aria_label": "AI 工作模式",
"ai_chat.header.session.connected": "{{title}} · 已連線",
"ai_chat.header.tooltip.close": "關閉面板",
"ai_chat.header.tooltip.export_markdown": "匯出為 Markdown",
@@ -616,6 +642,13 @@
"ai_chat.inspection.last_render_error.next_action.match_message": "先依 messageId 和 contentPreview 對照目前對話,確認是哪個氣泡觸發渲染異常。",
"ai_chat.inspection.last_render_error.next_action.narrow_scope": "如果還需要縮小範圍,再結合最近一次使用者輸入、工具結果和相關元件程式碼排查。",
"ai_chat.inspection.last_render_error.recorded_summary": "已記錄到最近一次 AI 訊息渲染異常,可用來定位是哪則訊息、哪段渲染邏輯與錯誤堆疊摘要。",
+ "ai_chat.inspection.mcp.message.configured": "目前共設定 {{serverCount}} 個 MCP 服務,其中 {{enabledCount}} 個已啟用",
+ "ai_chat.inspection.mcp.message.empty": "目前還沒有設定任何 MCP 服務",
+ "ai_chat.inspection.mcp.message.with_issues": "目前共設定 {{serverCount}} 個 MCP 服務,其中 {{enabledCount}} 個已啟用,{{issueCount}} 個設定檢查項需要確認",
+ "ai_chat.inspection.mcp.next_action.fix_config_errors": "先修復 MCP 服務設定錯誤,再重新測試服務",
+ "ai_chat.inspection.mcp.next_action.fix_config_warnings": "開啟受影響的 MCP 服務,並依照設定檢查提示拆分啟動命令、參數和逾時時間",
+ "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 個 MCP 服務存在啟動設定錯誤,測試和工具發現可能失敗",
+ "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 個 MCP 服務存在啟動設定警告,建議在排查工具發現失敗前先確認",
"ai_chat.inspection.mcp_docker.message.empty": "目前沒有 Docker MCP 服務",
"ai_chat.inspection.mcp_docker.message.with_enabled": "目前有 {{total}} 個 Docker MCP,其中 {{enabled}} 個已啟用",
"ai_chat.inspection.mcp_docker.message.with_incomplete": "目前有 {{total}} 個 Docker MCP,其中 {{count}} 個關鍵參數不完整",
@@ -704,13 +737,6 @@
"ai_chat.inspection.mcp_tool_schema.warning.missing_schema": "部分 MCP 工具沒有宣告 inputSchema,參數說明可能不完整。",
"ai_chat.inspection.mcp_tool_schema.warning.no_matches": "沒有找到匹配的 MCP 工具。",
"ai_chat.inspection.mcp_tool_schema.warning.no_tools": "目前沒有發現任何 MCP 工具,可能還沒有配置 MCP 服務,或服務測試/發現失敗。",
- "ai_chat.inspection.mcp.message.configured": "目前共設定 {{serverCount}} 個 MCP 服務,其中 {{enabledCount}} 個已啟用",
- "ai_chat.inspection.mcp.message.empty": "目前還沒有設定任何 MCP 服務",
- "ai_chat.inspection.mcp.message.with_issues": "目前共設定 {{serverCount}} 個 MCP 服務,其中 {{enabledCount}} 個已啟用,{{issueCount}} 個設定檢查項需要確認",
- "ai_chat.inspection.mcp.next_action.fix_config_errors": "先修復 MCP 服務設定錯誤,再重新測試服務",
- "ai_chat.inspection.mcp.next_action.fix_config_warnings": "開啟受影響的 MCP 服務,並依照設定檢查提示拆分啟動命令、參數和逾時時間",
- "ai_chat.inspection.mcp.warning.config_errors": "{{count}} 個 MCP 服務存在啟動設定錯誤,測試和工具發現可能失敗",
- "ai_chat.inspection.mcp.warning.config_warnings": "{{count}} 個 MCP 服務存在啟動設定警告,建議在排查工具發現失敗前先確認",
"ai_chat.inspection.message_flow.next_action.check_empty_assistant": "檢查異常或取消路徑是否留下空白 assistant 佔位訊息",
"ai_chat.inspection.message_flow.next_action.check_stream_append": "檢查串流追加邏輯是否重用同一個 assistantMsgId,而不是為同一輪回覆新建 assistant 訊息",
"ai_chat.inspection.message_flow.next_action.check_tool_results": "優先核對 useAIChatLocalTools 是否為每個 tool_call_id 寫入 tool 訊息",
@@ -890,6 +916,12 @@
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.detail": "返回当前聊天输入区是否已经具备发送条件,包括有没有活动供应商、当前供应商是否缺密钥或接口地址、是否已选模型、当前连接/表结构上下文是否已挂载,以及下一步建议动作。适合用户问“为什么现在不能发送”“输入框到底缺什么配置”“当前 AI 聊天准备好了没有”时先读真实状态。",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.params": "无参数",
"ai_chat.inspection.tool_info.inspect_ai_chat_readiness.tool_description": "读取当前 AI 聊天输入区的发送前置状态,包括活动供应商、密钥和接口地址是否完整、是否已选模型、当前连接上下文和已挂载表结构数量,以及建议的下一步动作。适用于用户提到为什么现在不能发送、为什么输入区还没准备好、当前到底缺什么配置时,先读取真实状态再回答。",
+ "ai_chat.inspection.tool_info.inspect_ai_context.desc": "查看当前 AI 已关联的表结构上下文",
+ "ai_chat.inspection.tool_info.inspect_ai_context.detail": "返回当前对话已经挂载到 AI 上下文里的表清单、所属连接与数据库,以及每张表的 DDL 预览。适合用户说“看看我现在带了哪些表结构”“当前 AI 上下文是什么”时,先读取真实挂载状态再继续分析。",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "可选,DDL 截断长度,默认 4000,最大 12000",
+ "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "可选,是否附带每张表的 DDL 内容,默认 false",
+ "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(默认 false), ddlLimit?(默认 4000)",
+ "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "读取当前对话已经关联到 AI 上下文里的表结构快照,包括连接、数据库、表名,以及可选的 DDL 内容。适用于用户提到当前 AI 上下文、当前关联表、当前挂载的表结构时,先读取真实状态,避免模型凭记忆复述。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.desc": "診斷 AI 上下文體量與穩定性風險",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.detail": "估算目前或指定 AI 會話中的最近訊息、工具結果、已掛載表 DDL、MCP 工具 schema、使用者提示詞和 Skills 體量,並回傳 low/medium/high/critical 風險、主要膨脹來源和收窄建議。適合 AI 變慢、亂答、上下文過大、工具結果過長或表結構過多時呼叫。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.includeDetails": "可選。是否回傳最大訊息、最大 DDL 表和最大 MCP schema 明細。預設 true。",
@@ -897,12 +929,6 @@
"ai_chat.inspection.tool_info.inspect_ai_context_budget.param.sessionId": "可選。要診斷的 AI 會話 ID;省略時使用目前活動會話。",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.params": "sessionId?(預設目前會話), messageLimit?(預設 40), includeDetails?(預設 true)",
"ai_chat.inspection.tool_info.inspect_ai_context_budget.tool_description": "讀取 AI 上下文體量與穩定性風險快照,包括最近訊息視窗、工具結果長度、已掛載表 DDL、MCP 工具 schema、使用者提示詞和啟用的 Skills,並回傳風險等級、告警和收窄建議。",
- "ai_chat.inspection.tool_info.inspect_ai_context.desc": "查看当前 AI 已关联的表结构上下文",
- "ai_chat.inspection.tool_info.inspect_ai_context.detail": "返回当前对话已经挂载到 AI 上下文里的表清单、所属连接与数据库,以及每张表的 DDL 预览。适合用户说“看看我现在带了哪些表结构”“当前 AI 上下文是什么”时,先读取真实挂载状态再继续分析。",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.ddlLimit": "可选,DDL 截断长度,默认 4000,最大 12000",
- "ai_chat.inspection.tool_info.inspect_ai_context.param.includeDDL": "可选,是否附带每张表的 DDL 内容,默认 false",
- "ai_chat.inspection.tool_info.inspect_ai_context.params": "includeDDL?(默认 false), ddlLimit?(默认 4000)",
- "ai_chat.inspection.tool_info.inspect_ai_context.tool_description": "读取当前对话已经关联到 AI 上下文里的表结构快照,包括连接、数据库、表名,以及可选的 DDL 内容。适用于用户提到当前 AI 上下文、当前关联表、当前挂载的表结构时,先读取真实状态,避免模型凭记忆复述。",
"ai_chat.inspection.tool_info.inspect_ai_guidance.desc": "查看当前 AI 提示词与 Skills 配置",
"ai_chat.inspection.tool_info.inspect_ai_guidance.detail": "返回当前用户自定义的全局/数据库/JVM 提示词,以及当前启用的 Skills、作用域、依赖工具和 skill prompt 内容。适合用户问“你现在到底带了哪些提示词”“为什么你会这样回答”“当前有哪些 Skills 在生效”时先读真实配置。",
"ai_chat.inspection.tool_info.inspect_ai_guidance.params": "无参数",
@@ -1213,15 +1239,10 @@
"ai_chat.mcp_client.install.state.missing": "外部工具接入狀態:未接入",
"ai_chat.mcp_client.install.state.remote": "外部工具接入狀態:需設定遠端 MCP 橋接",
"ai_chat.mcp_client.install.state.stale": "外部工具接入狀態:已有舊設定,需更新",
- "ai_chat.mcp_client.install.status_tone.connected": "已接入",
- "ai_chat.mcp_client.install.status_tone.not_connected": "未接入",
- "ai_chat.mcp_client.install.status_tone.remote_bridge": "遠端橋接",
- "ai_chat.mcp_client.install.status_tone.status_error": "狀態異常",
- "ai_chat.mcp_client.install.status_tone.update_required": "需更新",
- "ai_chat.mcp_client.install.status.cli_prefix": "CLI 偵測:{{status}}",
"ai_chat.mcp_client.install.status.cli.detected": "已偵測到 {{command}}",
"ai_chat.mcp_client.install.status.cli.not_detected": "未偵測到 {{command}},仍可先寫入設定",
"ai_chat.mcp_client.install.status.cli.remote": "遠端 Agent 不需要偵測本機 {{command}} 命令",
+ "ai_chat.mcp_client.install.status.cli_prefix": "CLI 偵測:{{status}}",
"ai_chat.mcp_client.install.status.command_path": "命令路徑:{{path}}",
"ai_chat.mcp_client.install.status.config_file": "設定檔:{{path}}",
"ai_chat.mcp_client.install.status.copy_command": "複製啟動命令",
@@ -1235,6 +1256,11 @@
"ai_chat.mcp_client.install.status.refresh": "重新整理狀態",
"ai_chat.mcp_client.install.status.remote_boundary": "遠端接入邊界:資料庫連線資訊和密碼仍保存在 Windows GoNavi;雲端 Agent 預設透過 schema-only MCP 工具讀取連線摘要、物件清單、資料表、檢視和 DDL,不註冊 execute_sql。跨機器接入請使用 GoNavi Streamable HTTP 模式,並搭配 token、隧道或反向代理。",
"ai_chat.mcp_client.install.status.title": "已選客戶端狀態",
+ "ai_chat.mcp_client.install.status_tone.connected": "已接入",
+ "ai_chat.mcp_client.install.status_tone.not_connected": "未接入",
+ "ai_chat.mcp_client.install.status_tone.remote_bridge": "遠端橋接",
+ "ai_chat.mcp_client.install.status_tone.status_error": "狀態異常",
+ "ai_chat.mcp_client.install.status_tone.update_required": "需更新",
"ai_chat.mcp_client.install.summary.connected": "{{label}} 已接入目前這份 GoNavi MCP,可直接在此客戶端呼叫。",
"ai_chat.mcp_client.install.summary.error": "{{label}} 的接入狀態讀取失敗,建議先重新整理偵測。",
"ai_chat.mcp_client.install.summary.missing": "目前尚未將這份 GoNavi MCP 接入 {{label}}。",
@@ -1296,8 +1322,8 @@
"ai_chat.message.tool_call.get_objects": "讀取資料庫物件清單",
"ai_chat.message.tool_call.get_table_ddl": "擷取建表語句",
"ai_chat.message.tool_call.get_tables": "分析資料表結構資訊",
- "ai_chat.message.tool_call.get_views": "分析檢視結構資訊",
"ai_chat.message.tool_call.get_triggers": "檢查觸發器邏輯",
+ "ai_chat.message.tool_call.get_views": "分析檢視結構資訊",
"ai_chat.message.tool_call.inspect_active_tab": "讀取目前作用中頁籤",
"ai_chat.message.tool_call.inspect_ai_chat_readiness": "讀取目前 AI 聊天送出前置狀態",
"ai_chat.message.tool_call.inspect_ai_context_budget": "診斷 AI 上下文體量風險",
@@ -1479,8 +1505,8 @@
"ai_chat.system.context.permission.allowed": "允許",
"ai_chat.system.context.permission.denied": "禁止",
"ai_chat.system.context.skill_prompt": "以下是目前啟用的 Skill「{{skillName}}」({{skillDescription}})。請在本次回答中遵循它的約束與工作方式:{{requiredTools}}\n{{content}}",
- "ai_chat.system.context.skill_prompt_without_description": "以下是目前啟用的 Skill「{{skillName}}」。請在本次回答中遵循它的約束與工作方式:{{requiredTools}}\n{{content}}",
"ai_chat.system.context.skill_prompt.required_tools": "\n依賴工具:{{requiredTools}}",
+ "ai_chat.system.context.skill_prompt_without_description": "以下是目前啟用的 Skill「{{skillName}}」。請在本次回答中遵循它的約束與工作方式:{{requiredTools}}\n{{content}}",
"ai_chat.system.inspection_guidance.inspect_ai_chat_readiness": "當使用者詢問為什麼不能傳送、目前 AI chat 缺什麼設定或輸入區是否就緒時,先呼叫 inspect_ai_chat_readiness 讀取真實傳送前置狀態。",
"ai_chat.system.inspection_guidance.inspect_ai_context": "當使用者詢問目前 AI 上下文、關聯表或會話附帶的表結構時,先呼叫 inspect_ai_context 讀取已掛載的表結構上下文。",
"ai_chat.system.inspection_guidance.inspect_ai_context_budget": "當使用者提到 AI 慢、上下文過大、表結構過多、工具結果太長、回答不穩定,或複雜任務前需要估算上下文時,先呼叫 inspect_ai_context_budget 讀取體量風險。",
@@ -1631,21 +1657,21 @@
"ai_settings.form.api_endpoint_required": "請輸入有效的端點地址",
"ai_settings.form.api_format": "API 格式",
"ai_settings.form.api_key": "API Key",
+ "ai_settings.form.api_key.codebuddy_hint": "留空則使用本機 CodeBuddy CLI 已登入帳號;填寫後會優先使用目前憑證。",
+ "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(可選)",
"ai_settings.form.api_key_keep_placeholder": "留空表示繼續沿用已儲存密鑰",
"ai_settings.form.api_key_placeholder": "sk-... / 你的 API Key",
"ai_settings.form.api_key_placeholder.codebuddy": "留空沿用本機登入態,或填寫 API Key / Token 覆蓋",
"ai_settings.form.api_key_required": "請輸入 API Key",
"ai_settings.form.api_key_saved_hint": "目前已儲存 API Key。留空表示繼續沿用,輸入新值表示替換。",
- "ai_settings.form.api_key.codebuddy_hint": "留空則使用本機 CodeBuddy CLI 已登入帳號;填寫後會優先使用目前憑證。",
- "ai_settings.form.api_key.codebuddy_optional": "API Key / Auth Token(可選)",
"ai_settings.form.clear_saved_api_key": "清除已儲存 API Key",
+ "ai_settings.form.inline_completion_model": "自動補全模型",
+ "ai_settings.form.inline_completion_model_hint": "建議選擇更小、更快的模型用於 SQL 編輯器灰色聯想。留空則跟隨聊天模型。",
+ "ai_settings.form.inline_completion_model_placeholder": "跟隨聊天模型",
"ai_settings.form.model_list": "可用模型清單(選填)",
"ai_settings.form.model_list_placeholder": "設定指定的模型 ID,留空則預設從服務端拉取",
"ai_settings.form.model_list_placeholder.codebuddy": "可選:預填常用模型;留空則由 CodeBuddy CLI 或服務端自動選擇",
"ai_settings.form.model_list_placeholder.cursor": "可選:預填常用 Cursor 模型 ID;留空則由 Cursor 預設模型自動選擇",
- "ai_settings.form.inline_completion_model": "自動補全模型",
- "ai_settings.form.inline_completion_model_hint": "建議選擇更小、更快的模型用於 SQL 編輯器灰色聯想。留空則跟隨聊天模型。",
- "ai_settings.form.inline_completion_model_placeholder": "跟隨聊天模型",
"ai_settings.form.provider_name": "供應商名稱",
"ai_settings.form.provider_name_placeholder": "例如:我的自建 OpenAI / 專屬大模型",
"ai_settings.form.provider_name_required": "請輸入名稱",
@@ -1678,7 +1704,6 @@
"ai_settings.mcp_http.status.not_running": "GoNavi MCP HTTP 服務未啟動",
"ai_settings.mcp_server.argument_hints.action_separator": ";",
"ai_settings.mcp_server.argument_hints.argument_details": "參數逐項說明",
- "ai_settings.mcp_server.argument_hints.business_arguments": "已識別業務參數",
"ai_settings.mcp_server.argument_hints.business.access_token.detail": "僅在 README 要求命令參數時傳入認證資料;優先使用環境變數。",
"ai_settings.mcp_server.argument_hints.business.access_token.label": "存取 Token",
"ai_settings.mcp_server.argument_hints.business.access_token.value_hint": "在本機填寫真實值;不要貼到聊天或截圖。",
@@ -1688,12 +1713,12 @@
"ai_settings.mcp_server.argument_hints.business.base_url.detail": "指定 MCP 服務需要存取的服務位址或 API 入口。",
"ai_settings.mcp_server.argument_hints.business.base_url.label": "基礎 URL",
"ai_settings.mcp_server.argument_hints.business.base_url.value_hint": "填寫完整位址,不要把密鑰放進 URL。",
- "ai_settings.mcp_server.argument_hints.business.config_file.detail": "指向 MCP 服務使用的本機檔案、目錄、倉庫或可執行檔。",
- "ai_settings.mcp_server.argument_hints.business.config_file.label": "設定檔",
- "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "使用本機絕對路徑,並授予最小必要範圍。",
"ai_settings.mcp_server.argument_hints.business.config.detail": "指向 MCP 服務使用的本機檔案、目錄、倉庫或可執行檔。",
"ai_settings.mcp_server.argument_hints.business.config.label": "設定檔",
"ai_settings.mcp_server.argument_hints.business.config.value_hint": "使用本機絕對路徑,並授予最小必要範圍。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.detail": "指向 MCP 服務使用的本機檔案、目錄、倉庫或可執行檔。",
+ "ai_settings.mcp_server.argument_hints.business.config_file.label": "設定檔",
+ "ai_settings.mcp_server.argument_hints.business.config_file.value_hint": "使用本機絕對路徑,並授予最小必要範圍。",
"ai_settings.mcp_server.argument_hints.business.dir.detail": "指向 MCP 服務使用的本機檔案、目錄、倉庫或可執行檔。",
"ai_settings.mcp_server.argument_hints.business.dir.label": "目錄",
"ai_settings.mcp_server.argument_hints.business.dir.value_hint": "使用本機絕對路徑,並授予最小必要範圍。",
@@ -1766,6 +1791,7 @@
"ai_settings.mcp_server.argument_hints.business.workspace.detail": "指向 MCP 服務使用的本機檔案、目錄、倉庫或可執行檔。",
"ai_settings.mcp_server.argument_hints.business.workspace.label": "工作區目錄",
"ai_settings.mcp_server.argument_hints.business.workspace.value_hint": "使用本機絕對路徑,並授予最小必要範圍。",
+ "ai_settings.mcp_server.argument_hints.business_arguments": "已識別業務參數",
"ai_settings.mcp_server.argument_hints.category.endpoint": "地址",
"ai_settings.mcp_server.argument_hints.category.generic": "業務",
"ai_settings.mcp_server.argument_hints.category.mode": "模式",
@@ -1975,10 +2001,10 @@
"ai_settings.mcp_server.env_hints.summary": "已識別 {{envVarCount}} 個變數,其中 {{secretLikeCount}} 個像密鑰;這裡只解釋 key 的用途和風險,不會顯示 value。",
"ai_settings.mcp_server.env_hints.title": "環境變數用途提示",
"ai_settings.mcp_server.env_hints.value_hint_prefix": "應填:",
- "ai_settings.mcp_server.env_hints.warning_prefix": "注意:{{warnings}}",
"ai_settings.mcp_server.env_hints.warning.docker_env_not_forwarded": "command=docker 時,這裡的環境變數只傳給 docker CLI,不會自動進入容器。",
"ai_settings.mcp_server.env_hints.warning.empty": "{{count}} 個環境變數值為空,測試前需要補齊或刪除。",
"ai_settings.mcp_server.env_hints.warning.placeholder": "{{count}} 個環境變數看起來仍是範例占位值。",
+ "ai_settings.mcp_server.env_hints.warning_prefix": "注意:{{warnings}}",
"ai_settings.mcp_server.form.action.delete": "刪除",
"ai_settings.mcp_server.form.action.delete_cancel": "取消",
"ai_settings.mcp_server.form.action.delete_confirm": "刪除這個 MCP 服務?",
@@ -1995,12 +2021,12 @@
"ai_settings.mcp_server.form.enabled.option.disabled": "已停用",
"ai_settings.mcp_server.form.enabled.option.enabled": "已啟用",
"ai_settings.mcp_server.form.enabled.title": "啟用狀態",
- "ai_settings.mcp_server.form.env_status.empty": "每行都要寫成 KEY=VALUE;沒有等號或 key 含空格的行不會儲存。",
- "ai_settings.mcp_server.form.env_status.invalid": "已識別 {{validCount}} 條環境變數,另有 {{invalidCount}} 行格式無效,本次不會儲存:{{invalidLines}}",
- "ai_settings.mcp_server.form.env_status.valid": "已識別 {{count}} 條環境變數。",
"ai_settings.mcp_server.form.env.description": "每行一個 KEY=VALUE,通常用於 API Key、工作目錄、服務地址等設定;不需要時可以留空。這裡會儲存到本機設定,並在啟動 MCP 程序時作為環境變數傳入;不要寫 export,也不要把密鑰寫進聊天內容。",
"ai_settings.mcp_server.form.env.placeholder": "環境變數,每行一個 KEY=VALUE,例如:\nOPENAI_API_KEY=...\nGITHUB_TOKEN=...",
"ai_settings.mcp_server.form.env.title": "環境變數",
+ "ai_settings.mcp_server.form.env_status.empty": "每行都要寫成 KEY=VALUE;沒有等號或 key 含空格的行不會儲存。",
+ "ai_settings.mcp_server.form.env_status.invalid": "已識別 {{validCount}} 條環境變數,另有 {{invalidCount}} 行格式無效,本次不會儲存:{{invalidLines}}",
+ "ai_settings.mcp_server.form.env_status.valid": "已識別 {{count}} 條環境變數。",
"ai_settings.mcp_server.form.instructions.save_description": "才會把這條 MCP 長期寫入本機設定。",
"ai_settings.mcp_server.form.instructions.save_title": "儲存",
"ai_settings.mcp_server.form.instructions.test_description": "只會按目前欄位試啟動一次,檢查能發現哪些工具,不會儲存設定。",
@@ -2023,8 +2049,6 @@
"ai_settings.mcp_server.form.transport.title": "傳輸方式",
"ai_settings.mcp_server.guide.examples.description": "啟動命令只填可執行程式本身,不要把參數混在一起。常見形式:",
"ai_settings.mcp_server.guide.examples.title": "填寫範例",
- "ai_settings.mcp_server.guide.field_lookup.description": "如果看到某個參數名不知道該填什麼,先看這一塊;下面每個欄位也都有更具體的範例和注意事項。",
- "ai_settings.mcp_server.guide.field_lookup.title": "欄位速查",
"ai_settings.mcp_server.guide.field.args.avoid": "不要再填 npx/node/uvx/python/docker,也不要把多個參數貼成一個長字串。",
"ai_settings.mcp_server.guide.field.args.detail": "例如 npx -y pkg --stdio,要拆成 -y、pkg 和 --stdio;docker run --rm -i image 要拆成 run、--rm、-i 和 image。",
"ai_settings.mcp_server.guide.field.args.fill": "逐項填 -y、包名、腳本名、-m、--stdio、run、--rm、-i、映像名等參數。",
@@ -2064,6 +2088,8 @@
"ai_settings.mcp_server.guide.field.transport.fill": "保持 stdio。",
"ai_settings.mcp_server.guide.field.transport.summary": "GoNavi 用什麼方式和這個 MCP Server 通訊。",
"ai_settings.mcp_server.guide.field.transport.title": "傳輸方式",
+ "ai_settings.mcp_server.guide.field_lookup.description": "如果看到某個參數名不知道該填什麼,先看這一塊;下面每個欄位也都有更具體的範例和注意事項。",
+ "ai_settings.mcp_server.guide.field_lookup.title": "欄位速查",
"ai_settings.mcp_server.guide.full_command.apply": "自動拆分到下方欄位",
"ai_settings.mcp_server.guide.full_command.description": "直接貼上完整命令,GoNavi 會自動拆成「啟動命令 / 命令參數 / 環境變數」三塊;支援 Unix 的 KEY=VALUE,也支援 Windows PowerShell 的 $env:KEY=VALUE; 和 cmd 的 set KEY=VALUE && 寫法。",
"ai_settings.mcp_server.guide.full_command.parsed_summary": "將解析為:命令 {{command}},參數 {{argsCount}} 個,環境變數 {{envCount}} 個。",
@@ -2135,18 +2161,18 @@
"ai_settings.mcp_server.remote_quick_start.example_prefix": "範例:",
"ai_settings.mcp_server.remote_quick_start.fill_prefix": "應填:",
"ai_settings.mcp_server.remote_quick_start.guide.access_heading": "建議接入方式:",
- "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "目前邊界:",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.local_stdio": "GoNavi 內建 MCP 本機入口是 stdio,適合 Claude Code / Codex 這類和 GoNavi 在同一台機器上的用戶端。",
"ai_settings.mcp_server.remote_quick_start.guide.boundary.remote_cloud": "如果 OpenClaw/Hermans 部署在雲端 Linux,不能直接使用 Windows 本機 stdio 命令;可在 Windows 上啟動 GoNavi Streamable HTTP 模式,再透過通道或反向代理給雲端 Agent 呼叫。",
+ "ai_settings.mcp_server.remote_quick_start.guide.boundary_heading": "目前邊界:",
"ai_settings.mcp_server.remote_quick_start.guide.config_command_heading": "無 GUI / CLI 產生設定命令:",
"ai_settings.mcp_server.remote_quick_start.guide.config_heading": "可複製設定片段(適用於支援 mcpServers JSON 的 Agent):",
"ai_settings.mcp_server.remote_quick_start.guide.current_hint": "目前提示:{{message}}",
"ai_settings.mcp_server.remote_quick_start.guide.env_fallback": "或設定環境變數 GONAVI_MCP_HTTP_TOKEN= 後執行 {{standaloneCommand}}",
"ai_settings.mcp_server.remote_quick_start.guide.execute_sql_note": "如果明確需要遠端執行 SQL,可移除 --schema-only;此時 execute_sql 仍受 GoNavi AI 安全控制約束,寫入操作必須明確傳入 allowMutating=true。",
- "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目標:",
"ai_settings.mcp_server.remote_quick_start.guide.goal.credentials_stay_local": "資料庫連線、帳號和密碼繼續保存在 Windows 上的 GoNavi。雲端 Agent 不需要保存資料庫密碼。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.schema_only": "遠端接入預設使用 schema-only 模式,不註冊 execute_sql,適合只讓 OpenClaw/Hermans 讀取資料庫結構。",
"ai_settings.mcp_server.remote_quick_start.guide.goal.tools_only": "雲端 Agent 只透過 MCP tools 讀取 get_connections/get_databases/get_objects/get_tables/get_views/get_columns/get_table_ddl 等結果。",
+ "ai_settings.mcp_server.remote_quick_start.guide.goal_heading": "目標:",
"ai_settings.mcp_server.remote_quick_start.guide.launch_command_heading": "CLI / 服務啟動命令:",
"ai_settings.mcp_server.remote_quick_start.guide.step.configure_remote_server": "3. 在 {{displayName}} 中新增遠端 MCP Server,transport 選擇 Streamable HTTP,URL 填通道/反向代理後的 /mcp 位址,並設定 Authorization: Bearer 。",
"ai_settings.mcp_server.remote_quick_start.guide.step.inspect_schema": "4. 先呼叫 get_connections 取得 connectionId,再呼叫表結構工具;不要把資料庫 host/user/password 寫進雲端 Agent 設定。",
@@ -2279,15 +2305,26 @@
"ai_settings.prompts.field.database.title": "資料庫會話補充提示詞",
"ai_settings.prompts.field.global.description": "對所有 AI 會話生效,例如「先給結論」「回答保持簡潔」。",
"ai_settings.prompts.field.global.title": "全域補充提示詞",
- "ai_settings.prompts.field.jvm_diagnostic.description": "僅 JVM 診斷工作台生效,例如「先給計畫,再給命令」。",
- "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 診斷補充提示詞",
"ai_settings.prompts.field.jvm.description": "僅 JVM 資源瀏覽/分析場景生效。",
"ai_settings.prompts.field.jvm.title": "JVM 資源分析補充提示詞",
+ "ai_settings.prompts.field.jvm_diagnostic.description": "僅 JVM 診斷工作台生效,例如「先給計畫,再給命令」。",
+ "ai_settings.prompts.field.jvm_diagnostic.title": "JVM 診斷補充提示詞",
"ai_settings.prompts.message.save_failed": "儲存自訂提示詞失敗",
"ai_settings.prompts.message.saved": "自訂提示詞已儲存",
"ai_settings.prompts.placeholder.empty": "留空表示不額外追加",
"ai_settings.prompts.user.description": "這裡的內容會在系統內建提示詞之後,以 system message 的形式追加注入。適合放個人風格偏好、輸出限制或團隊規範。涉及安全紅線時,系統規則仍然優先。",
"ai_settings.prompts.user.title": "使用者級自訂提示詞",
+ "ai_settings.provider.action.add": "新增模型供應商",
+ "ai_settings.provider.action.delete": "刪除",
+ "ai_settings.provider.action.edit": "編輯",
+ "ai_settings.provider.auto_model": "自動選擇",
+ "ai_settings.provider.confirm_delete": "確認刪除?",
+ "ai_settings.provider.editor.add_title": "新增模型供應商",
+ "ai_settings.provider.editor.edit_title": "編輯模型供應商",
+ "ai_settings.provider.empty.description": "新增一個供應商以開始使用 AI 助手",
+ "ai_settings.provider.empty.title": "尚未設定模型供應商",
+ "ai_settings.provider.next_provider": "下一個供應商",
+ "ai_settings.provider.no_model": "尚未選擇模型",
"ai_settings.provider_preset.anthropic.desc": "Claude Opus/Sonnet 模型",
"ai_settings.provider_preset.anthropic.label": "Claude",
"ai_settings.provider_preset.custom.desc": "自訂 API 端點",
@@ -2314,17 +2351,6 @@
"ai_settings.provider_preset.volcengine_coding.label": "火山 Coding Plan",
"ai_settings.provider_preset.zhipu.desc": "GLM-5 / GLM-5-Turbo 模型",
"ai_settings.provider_preset.zhipu.label": "智譜 GLM",
- "ai_settings.provider.action.add": "新增模型供應商",
- "ai_settings.provider.action.delete": "刪除",
- "ai_settings.provider.action.edit": "編輯",
- "ai_settings.provider.auto_model": "自動選擇",
- "ai_settings.provider.confirm_delete": "確認刪除?",
- "ai_settings.provider.editor.add_title": "新增模型供應商",
- "ai_settings.provider.editor.edit_title": "編輯模型供應商",
- "ai_settings.provider.empty.description": "新增一個供應商以開始使用 AI 助手",
- "ai_settings.provider.empty.title": "尚未設定模型供應商",
- "ai_settings.provider.next_provider": "下一個供應商",
- "ai_settings.provider.no_model": "尚未選擇模型",
"ai_settings.safety.description": "控制 AI 可執行的 SQL 操作類型,保護資料安全",
"ai_settings.safety.full.desc": "AI 可執行所有操作(含 DDL),高風險操作會自動警示。",
"ai_settings.safety.full.label": "完整模式",
@@ -2348,10 +2374,10 @@
"ai_settings.skill.scope.database.label": "資料庫",
"ai_settings.skill.scope.global.desc": "所有 AI 會話都啟用",
"ai_settings.skill.scope.global.label": "全域",
- "ai_settings.skill.scope.jvm_diagnostic.desc": "僅 JVM 診斷工作台啟用",
- "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 診斷",
"ai_settings.skill.scope.jvm.desc": "僅 JVM 資源分析場景啟用",
"ai_settings.skill.scope.jvm.label": "JVM 資源",
+ "ai_settings.skill.scope.jvm_diagnostic.desc": "僅 JVM 診斷工作台啟用",
+ "ai_settings.skill.scope.jvm_diagnostic.label": "JVM 診斷",
"ai_settings.skill.scopes_placeholder": "選擇這個 Skill 要作用到哪些場景",
"ai_settings.skill.status.disabled": "已停用",
"ai_settings.skill.status.enabled": "已啟用",
@@ -2380,39 +2406,13 @@
"ai_settings.tools.parameters.optional": "可選",
"ai_settings.tools.parameters.required": "必填",
"ai_settings.tools.parameters.type_label": "類型:{{type}}",
- "ai_settings.tools.params_label": "參數:",
"ai_settings.tools.params.none": "無參數",
+ "ai_settings.tools.params_label": "參數:",
"ai_settings.tools.search.aria_label": "搜尋內建工具",
"ai_settings.tools.search.clear": "清除",
"ai_settings.tools.search.placeholder": "搜尋工具、流程或參數,例如 mcp / lineLimit / allowMutating / 事務",
"ai_settings.tools.summary": "目前顯示 {{flowVisible}}/{{flowTotal}} 條推薦流程,{{toolVisible}}/{{toolTotal}} 個內建工具。",
"ai_settings.tools.workflow": "💡 工作流程:get_connections → get_databases → get_tables → get_columns → 生成 SQL",
- "ai.service.mcp_client.claude_code.config_dir_create_failed": "建立 Claude Code 設定目錄失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.config_format_invalid": "Claude Code 設定格式異常:{{path}} 應為 {{expected}}",
- "ai.service.mcp_client.claude_code.config_parse_failed": "解析 Claude Code 設定失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.config_path_failed": "定位 Claude Code 設定失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.config_read_failed": "讀取 Claude Code 設定失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.config_serialize_failed": "序列化 Claude Code 設定失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.config_write_failed": "寫入 Claude Code 設定失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.install_success": "已寫入 Claude Code 使用者層級 MCP 設定,重新啟動 Claude CLI 後可在 /mcp 的 User MCPs 中看到 GoNavi。",
- "ai.service.mcp_client.claude_code.status.connected": "已偵測到 Claude Code 使用者層級 GoNavi MCP 設定,且與目前 GoNavi 安裝路徑一致",
- "ai.service.mcp_client.claude_code.status.missing": "未偵測到 Claude Code 使用者層級 GoNavi MCP 設定",
- "ai.service.mcp_client.claude_code.status.path_check_failed": "已偵測到 Claude Code 中的 GoNavi MCP 記錄,但目前 GoNavi 安裝路徑校驗失敗:{{detail}}",
- "ai.service.mcp_client.claude_code.status.path_mismatch": "已偵測到 Claude Code 中的 GoNavi MCP 記錄,但與目前 GoNavi 安裝路徑不一致,建議更新",
- "ai.service.mcp_client.codex.config_dir_create_failed": "建立 Codex 設定目錄失敗:{{detail}}",
- "ai.service.mcp_client.codex.config_format_invalid": "Codex 設定格式異常:{{path}} 無法按 {{expected}} 解析",
- "ai.service.mcp_client.codex.config_path_failed": "定位 Codex 設定失敗:{{detail}}",
- "ai.service.mcp_client.codex.config_read_failed": "讀取 Codex 設定失敗:{{detail}}",
- "ai.service.mcp_client.codex.config_write_failed": "寫入 Codex 設定失敗:{{detail}}",
- "ai.service.mcp_client.codex.install_success": "已寫入 Codex 使用者層級 MCP 設定,重新啟動 Codex CLI 或桌面端後可看到 GoNavi。",
- "ai.service.mcp_client.codex.status.connected": "已偵測到 Codex 使用者層級 GoNavi MCP 設定,且與目前 GoNavi 安裝路徑一致",
- "ai.service.mcp_client.codex.status.missing": "未偵測到 Codex 使用者層級 GoNavi MCP 設定",
- "ai.service.mcp_client.codex.status.path_check_failed": "已偵測到 Codex 中的 GoNavi MCP 記錄,但目前 GoNavi 安裝路徑校驗失敗:{{detail}}",
- "ai.service.mcp_client.codex.status.path_mismatch": "已偵測到 Codex 中的 GoNavi MCP 記錄,但與目前 GoNavi 安裝路徑不一致,建議更新",
- "ai.service.mcp_client.executable_path_empty": "目前 GoNavi 可執行檔路徑為空",
- "ai.service.mcp_client.executable_path_failed": "定位目前 GoNavi 可執行檔失敗:{{detail}}",
- "ai.service.mcp_client.remote.status.message": "{{label}} 通常部署在雲端或遠端環境;請透過遠端 MCP 橋接接入 Windows GoNavi,資料庫密碼仍保存在 GoNavi 本機。",
- "ai.service.mcp_client.user_home_dir_unavailable": "無法判定目前使用者目錄",
"app.about.action.check_updates": "檢查更新",
"app.about.action.download_progress": "下載进度",
"app.about.action.download_update": "下載更新",
@@ -2433,10 +2433,10 @@
"app.about.hero.update_available_version": "發現新版本 {{version}}",
"app.about.last_checked_at": "上次檢查時間:{{time}}",
"app.about.last_checked_never": "尚未檢查更新",
+ "app.about.message.channel_switch_failed_with_error": "切換更新通道失敗:{{error}}",
"app.about.message.check_failed_with_error": "檢查更新失敗: {{error}}",
"app.about.message.download_completed": "更新下載完成",
"app.about.message.download_completed_with_path": "更新下載完成,更新套件路徑:{{path}}",
- "app.about.message.channel_switch_failed_with_error": "切換更新通道失敗:{{error}}",
"app.about.message.download_failed_with_error": "更新下載失敗: {{error}}",
"app.about.message.install_directory_opened_manual_replace": "已開啟安裝目錄,請手動完成替換",
"app.about.message.install_failed_with_error": "更新安裝失敗: {{error}}",
@@ -2491,6 +2491,8 @@
"app.browser_mock.mcp_tool.unavailable": "瀏覽器 mock 未接入真實 MCP 服務",
"app.browser_mock.provider.test_failed_detail": "連線測試失敗:{{detail}}",
"app.browser_mock.provider.test_success": "端點連通性測試成功",
+ "app.connection.message.editable_load_failed": "讀取已儲存連線詳情失敗,將改為開啟脫敏設定",
+ "app.connection.message.editable_load_failed_with_detail": "讀取已儲存連線詳情失敗:{{detail}},將改為開啟脫敏設定",
"app.connection_package.action.start_export": "開始匯出",
"app.connection_package.action.start_import": "開始匯入",
"app.connection_package.dialog.export_title": "匯出連線",
@@ -2517,8 +2519,6 @@
"app.connection_package.message.imported_with_missing_passwords": "成功匯入 {{count}} 個連線,部分連線未包含密碼,請編輯對應連線並輸入密碼後儲存",
"app.connection_package.message.no_connections_to_export": "沒有連線可匯出",
"app.connection_package.message.unsupported_file_format": "檔案格式錯誤:僅支援 GoNavi 恢復包、歷史 JSON 連線陣列、MySQL Workbench XML 或 Navicat NCX",
- "app.connection.message.editable_load_failed": "讀取已儲存連線詳情失敗,將改為開啟脫敏設定",
- "app.connection.message.editable_load_failed_with_detail": "讀取已儲存連線詳情失敗:{{detail}},將改為開啟脫敏設定",
"app.data_root.action.migrate_and_switch": "遷移现有資料并切换",
"app.data_root.action.open_current": "開啟目前目錄",
"app.data_root.action.restore_default_directory": "還原預設目錄",
@@ -2660,16 +2660,19 @@
"app.settings.entry.ai.title": "AI 設定",
"app.settings.entry.proxy.description": "统一設定更新檢查、驅動管理和公共网络出口。",
"app.settings.entry.proxy.title": "全局代理",
- "app.settings.entry.web_auth.description": "檢視瀏覽器存取驗證狀態,並修改管理員密碼。",
- "app.settings.entry.web_auth.title": "瀏覽器存取驗證",
"app.settings.entry.theme.description": "切换亮暗主題并调整界面观感。",
"app.settings.entry.theme.title": "主題与外观",
+ "app.settings.entry.web_auth.description": "檢視瀏覽器存取驗證狀態,並修改管理員密碼。",
+ "app.settings.entry.web_auth.title": "瀏覽器存取驗證",
"app.settings.group.about.description": "檢視版本資訊、倉庫位址和其他產品資訊。",
"app.settings.group.about.title": "關於",
"app.settings.group.preferences.description": "統一管理語言、外觀和側欄顯示偏好。",
"app.settings.group.preferences.title": "偏好設定",
"app.settings.group.services.description": "統一管理網路存取與 AI 相關服務設定。",
"app.settings.group.services.title": "服務設定",
+ "app.settings.sidebar_metadata.description": "選擇左側樹中表名後要顯示哪些中介資料。",
+ "app.settings.sidebar_metadata.title": "側欄表格中介資料",
+ "app.settings.title": "設定中心",
"app.settings.web_auth.description": "這裡可以檢視目前瀏覽器存取驗證狀態、工作階段策略和 2FA 啟用情況,也可以在登入後修改管理員密碼。",
"app.settings.web_auth.load_failed": "讀取瀏覽器存取驗證設定失敗",
"app.settings.web_auth.password.code_label": "目前驗證碼 / 恢復碼",
@@ -2700,13 +2703,14 @@
"app.settings.web_auth.value.hours": "{{count}} 小時",
"app.settings.web_auth.value.minutes": "{{count}} 分鐘",
"app.settings.web_auth.value.recovery_codes": "剩餘 {{count}} 個",
- "app.settings.sidebar_metadata.description": "選擇左側樹中表名後要顯示哪些中介資料。",
- "app.settings.sidebar_metadata.title": "側欄表格中介資料",
- "app.settings.title": "設定中心",
"app.shortcuts.action.diagnoseQuery.description": "對目前 SQL 執行 EXPLAIN 並顯示執行計劃圖與索引建議",
"app.shortcuts.action.diagnoseQuery.label": "SQL 診斷",
+ "app.shortcuts.action.duplicateCurrentLine.description": "在查詢編輯器中複製游標所在行並插入到下一行",
+ "app.shortcuts.action.duplicateCurrentLine.label": "複製目前行到下一行",
"app.shortcuts.action.focusSidebarSearch.description": "定位到左側連線樹搜尋框",
"app.shortcuts.action.focusSidebarSearch.label": "聚焦側邊欄搜尋",
+ "app.shortcuts.action.formatSql.description": "格式化目前查詢編輯器中的 SQL",
+ "app.shortcuts.action.formatSql.label": "美化 SQL",
"app.shortcuts.action.newConnection.description": "建立新的資料庫、執行階段或其他資料來源連線",
"app.shortcuts.action.newConnection.label": "新增資料來源",
"app.shortcuts.action.newQueryTab.description": "建立新的 SQL 查詢標籤頁",
@@ -2721,12 +2725,6 @@
"app.shortcuts.action.runQuery.label": "執行 SQL",
"app.shortcuts.action.saveQuery.description": "儲存目前查詢頁;未命名查詢會開啟儲存彈窗",
"app.shortcuts.action.saveQuery.label": "儲存查詢",
- "app.shortcuts.action.duplicateCurrentLine.description": "在查詢編輯器中複製游標所在行並插入到下一行",
- "app.shortcuts.action.duplicateCurrentLine.label": "複製目前行到下一行",
- "app.shortcuts.action.formatSql.description": "格式化目前查詢編輯器中的 SQL",
- "app.shortcuts.action.formatSql.label": "美化 SQL",
- "app.shortcuts.action.triggerSqlAiCompletion.description": "在目前 SQL 編輯器中手動請求 AI 灰色自動補全",
- "app.shortcuts.action.triggerSqlAiCompletion.label": "觸發 SQL AI 自動補全",
"app.shortcuts.action.selectCurrentStatement.description": "在查詢編輯器中選取游標所在行並複製到剪貼簿",
"app.shortcuts.action.selectCurrentStatement.label": "選取目前行並複製",
"app.shortcuts.action.sendAIChatMessage.description": "在 AI 輸入框中送出目前訊息,Shift+Enter 一律換行",
@@ -2747,6 +2745,8 @@
"app.shortcuts.action.toggleQueryResultsPanel.label": "切換結果區",
"app.shortcuts.action.toggleTheme.description": "在淺色與深色主題之間切換",
"app.shortcuts.action.toggleTheme.label": "切換主題",
+ "app.shortcuts.action.triggerSqlAiCompletion.description": "在目前 SQL 編輯器中手動請求 AI 灰色自動補全",
+ "app.shortcuts.action.triggerSqlAiCompletion.label": "觸發 SQL AI 自動補全",
"app.shortcuts.capture_hint": "點擊「錄製」後按下快捷鍵。按 Esc 可取消錄製。全域快捷鍵建議包含修飾鍵;AI 聊天傳送僅支援 Enter 相關組合,Shift+Enter 保留換行。",
"app.shortcuts.capture_waiting": "請按下快捷鍵...",
"app.shortcuts.context.datagrid": "資料表格",
@@ -2785,29 +2785,29 @@
"app.startup_readiness.loading_local_config": "正在載入本機設定...",
"app.startup_readiness.loading_security_config": "正在載入安全設定...",
"app.theme.action.restore_defaults": "還原預設",
- "app.theme.appearance_settings_description": "集中調整縮放、字型、透明度與模糊效果。",
- "app.theme.appearance_settings_title": "外觀設定",
"app.theme.appearance.blur_hint": "* 仅控制套用内覆盖层的模糊效果",
"app.theme.appearance.blur_title": "高斯模糊 (Blur)",
"app.theme.appearance.enable_transparency_blur": "啟用透明与模糊",
"app.theme.appearance.enable_transparency_blur_hint": "關閉后保留目前阈值,重新开启时直接還原之前的設定。",
"app.theme.appearance.font_size_title": "基础字体大小 (Font Size)",
"app.theme.appearance.opacity_title": "背景不透明度 (Opacity)",
+ "app.theme.appearance.sidebar_rail_scale_hint": "僅影響 V2 左側導覽軌,適合在大螢幕上放大按鈕與連線圖示。",
+ "app.theme.appearance.sidebar_rail_scale_title": "左側導覽按鈕大小",
"app.theme.appearance.transparency_blur_title": "透明与模糊效果",
"app.theme.appearance.ui_scale_hint": "* 建议小屏设备設定为 85%-95%",
"app.theme.appearance.ui_scale_title": "界面缩放 (UI Scale)",
- "app.theme.appearance.sidebar_rail_scale_hint": "僅影響 V2 左側導覽軌,適合在大螢幕上放大按鈕與連線圖示。",
- "app.theme.appearance.sidebar_rail_scale_title": "左側導覽按鈕大小",
"app.theme.appearance.windows_acrylic_hint": "Windows 使用系统 Acrylic 效果,模糊程度由系统控制",
+ "app.theme.appearance_settings_description": "集中調整縮放、字型、透明度與模糊效果。",
+ "app.theme.appearance_settings_title": "外觀設定",
"app.theme.data_table.column_width_hint": "标准模式預設列宽 200px;紧凑模式預設列宽 140px。已手动拖拽调整的列宽优先保留。",
"app.theme.data_table.column_width_mode": "資料表列宽模式",
"app.theme.data_table.column_width_mode.compact": "紧凑 140px",
"app.theme.data_table.column_width_mode.standard": "标准 200px",
"app.theme.data_table.density": "表格密度",
- "app.theme.data_table.density_hint": "控制列高、欄寬和內距。舒適適合大螢幕細看;緊湊適合最大化資訊密度。已手動拖曳的欄寬會優先保留。",
"app.theme.data_table.density.comfortable": "舒適",
"app.theme.data_table.density.compact": "緊湊",
"app.theme.data_table.density.standard": "標準",
+ "app.theme.data_table.density_hint": "控制列高、欄寬和內距。舒適適合大螢幕細看;緊湊適合最大化資訊密度。已手動拖曳的欄寬會優先保留。",
"app.theme.data_table.follow_global": "跟隨全域",
"app.theme.data_table.font_size": "資料表字型大小",
"app.theme.data_table.sidebar_tree_font_size": "左側庫表字型大小",
@@ -2831,26 +2831,26 @@
"app.theme.font_family.mono_title": "程式碼字型 (Mono Font Family)",
"app.theme.font_family.title": "字型族",
"app.theme.font_family.ui_title": "介面字型 (UI Font Family)",
- "app.theme.query_template.description": "設定新建查詢分頁時預先填入的 SQL 內容。",
- "app.theme.query_template.hint": "清空後新建查詢會保持空白;點擊「恢復預設」可回到 SELECT * FROM 。",
- "app.theme.query_template.reset_default": "恢復預設",
- "app.theme.query_template.title": "新建查詢預設 SQL",
"app.theme.mac_window.restart_hint": "* 已同步隐藏右上角自定义按钮;如系统視窗样式未立即重新整理,可重启套用后再确认",
"app.theme.mac_window.title": "macOS 視窗控制",
"app.theme.mac_window.use_native_controls": "使用 macOS 原生視窗控制",
"app.theme.mac_window.use_native_controls_hint": "啟用后显示左上角红黄绿按钮,并优先使用 macOS 原生全屏行为。",
- "app.theme.mode_title": "主題模式",
"app.theme.mode.dark.description": "適合低光源環境,視覺感受更沉穩。",
"app.theme.mode.dark.label": "深色主題",
"app.theme.mode.light.description": "適合明亮環境,視覺層次更輕盈。",
"app.theme.mode.light.label": "淺色主題",
"app.theme.mode.system.description": "跟隨作業系統外觀並自動切換。",
"app.theme.mode.system.label": "跟隨系統",
+ "app.theme.mode_title": "主題模式",
"app.theme.nav.appearance.description": "縮放、字型與透明度",
"app.theme.nav.appearance.title": "外觀參數",
"app.theme.nav.theme.description": "淺色與深色切換",
"app.theme.nav.theme.title": "主題模式",
"app.theme.navigation_title": "設定導覽",
+ "app.theme.query_template.description": "設定新建查詢分頁時預先填入的 SQL 內容。",
+ "app.theme.query_template.hint": "清空後新建查詢會保持空白;點擊「恢復預設」可回到 SELECT * FROM 。",
+ "app.theme.query_template.reset_default": "恢復預設",
+ "app.theme.query_template.title": "新建查詢預設 SQL",
"app.theme.startup_window.fullscreen": "启动时全屏",
"app.theme.startup_window.fullscreen_windows": "启动时全屏(Windows 按最大化处理)",
"app.theme.startup_window.hint": "* 修改后下次启动生效",
@@ -2930,10 +2930,12 @@
"app.update.action.hide_to_background": "隐藏到背景",
"app.update.action.install_update": "安裝更新",
"app.update.action.open_install_directory": "開啟安裝目錄",
+ "app.update.backend.error.channel_invalid": "無效的更新通道:{{channel}}",
"app.update.backend.error.check_failed": "檢查更新失敗:{{detail}}",
"app.update.backend.error.check_http_status": "檢查更新失敗:HTTP {{status}}",
- "app.update.backend.error.channel_invalid": "無效的更新通道:{{channel}}",
"app.update.backend.error.download_failed": "更新下載失敗:{{detail}}",
+ "app.update.backend.error.install_target_not_writable": "目前安裝目錄不可寫:{{path}}({{detail}})",
+ "app.update.backend.error.install_target_unresolved": "無法確定目前安裝目錄",
"app.update.backend.error.install_unsupported": "目前平台暫不支援更新安裝:{{platform}}",
"app.update.backend.error.latest_version_unparseable": "無法解析最新版本號",
"app.update.backend.error.network_dns": "連線到 GitHub 失敗:無法解析 {{host}}。請確認全域代理已套用,或先在全域代理設定中測試連線。",
@@ -2946,8 +2948,6 @@
"app.update.backend.error.sha256_missing_current_package": "SHA256SUMS 未包含目前平台更新套件",
"app.update.backend.error.sha256sums_download_failed": "下載 SHA256SUMS 失敗:HTTP {{status}}",
"app.update.backend.error.sha256sums_missing": "Release 未提供 SHA256SUMS",
- "app.update.backend.error.install_target_not_writable": "目前安裝目錄不可寫:{{path}}({{detail}})",
- "app.update.backend.error.install_target_unresolved": "無法確定目前安裝目錄",
"app.update.backend.error.update_package_not_found": "未找到更新套件:{{name}}",
"app.update.backend.message.app_directory_unavailable": "無法存取應用程式目錄:{{path}}",
"app.update.backend.message.app_directory_unresolved_download": "無法判斷目前應用程式目錄,因此無法下載更新",
@@ -3015,6 +3015,64 @@
"common.success": "成功",
"common.unknown": "未知",
"common.warning": "警告",
+ "connection.backend.action.apply_result_changes": "提交結果修改",
+ "connection.backend.action.clear_table": "清空資料表資料",
+ "connection.backend.action.create_database": "建立資料庫",
+ "connection.backend.action.create_schema": "建立結構描述",
+ "connection.backend.action.data_sync_structure": "同步目標結構",
+ "connection.backend.action.data_sync_write": "寫入資料同步結果",
+ "connection.backend.action.drop_database": "刪除資料庫",
+ "connection.backend.action.drop_function_or_procedure": "刪除函式或預存程序",
+ "connection.backend.action.drop_schema": "刪除結構描述",
+ "connection.backend.action.drop_table": "刪除資料表",
+ "connection.backend.action.drop_view": "刪除檢視",
+ "connection.backend.action.import_data": "匯入資料",
+ "connection.backend.action.preview_result_changes": "預覽結果修改",
+ "connection.backend.action.rename_database": "重新命名資料庫",
+ "connection.backend.action.rename_schema": "重新命名結構描述",
+ "connection.backend.action.rename_table": "重新命名資料表",
+ "connection.backend.action.rename_view": "重新命名檢視",
+ "connection.backend.action.truncate_table": "截斷資料表",
+ "connection.backend.error.readonly_action_blocked": "目前連線已啟用正式保護,禁止執行{{action}}",
+ "connection.copy_suffix": " - 副本",
+ "connection.delete": "刪除連線",
+ "connection.edit": "編輯連線",
+ "connection.new": "新增連線",
+ "connection.oceanbase.error.unsupported_protocol": "OceanBase 目前僅支援 MySQL/Oracle 租戶協議,不支援「{{value}}」;請改用 MySQL 或 Oracle。",
+ "connection.sidebar.delete.backendUnavailable": "刪除連線失敗:後端介面不可用",
+ "connection.sidebar.delete.confirmContent": "確定要刪除連線 \"{{name}}\" 嗎?",
+ "connection.sidebar.delete.confirmTitle": "確認刪除",
+ "connection.sidebar.delete.failureFallback": "刪除連線失敗",
+ "connection.sidebar.delete.success": "已刪除連線",
+ "connection.sidebar.disconnect.success": "已中斷連線",
+ "connection.sidebar.duplicate.backendUnavailable": "複製連線失敗:後端介面不可用",
+ "connection.sidebar.duplicate.failureFallback": "複製連線失敗",
+ "connection.sidebar.duplicate.noResult": "複製連線失敗:後端未回傳結果",
+ "connection.sidebar.duplicate.success": "已複製連線: {{name}}",
+ "connection.sidebar.group.badge": "分組",
+ "connection.sidebar.group.collapseAria": "收合連線分組 {{name}}",
+ "connection.sidebar.group.delete": "刪除分組",
+ "connection.sidebar.group.deleteConfirmContent": "確定要刪除分組 \"{{name}}\" 嗎?這不會刪除其中的連線。",
+ "connection.sidebar.group.deleteConfirmTitle": "確認刪除",
+ "connection.sidebar.group.edit": "編輯分組",
+ "connection.sidebar.group.expandAria": "展開連線分組 {{name}}",
+ "connection.sidebar.group.meta": "{{count}} 個連線 · 連線分組",
+ "connection.sidebar.group.untitled": "未命名分組",
+ "connection.sidebar.menu.copy": "複製連線",
+ "connection.sidebar.menu.createDatabase": "新增資料庫",
+ "connection.sidebar.menu.current": "目前",
+ "connection.sidebar.menu.delete": "刪除連線",
+ "connection.sidebar.menu.disconnect": "中斷連線",
+ "connection.sidebar.menu.groupSection": "連線分組",
+ "connection.sidebar.menu.hostBadge": "HOST",
+ "connection.sidebar.menu.hostFallback": "位址未設定",
+ "connection.sidebar.menu.moveOutTag": "移出標籤",
+ "connection.sidebar.menu.moveToTag": "移至標籤",
+ "connection.sidebar.menu.moveToUngrouped": "移出分組",
+ "connection.sidebar.menu.refresh": "重新整理連線",
+ "connection.sidebar.menu.section": "連線",
+ "connection.test": "測試連線",
+ "connection.unnamed": "未命名連線",
"connection_modal.action.browse": "瀏覽...",
"connection_modal.action.cancel": "取消",
"connection_modal.action.close": "關閉",
@@ -3067,12 +3125,12 @@
"connection_modal.config_section.uri.description": "輸入、產生或解析連線 URI。",
"connection_modal.config_section.uri.title": "連線 URI",
"connection_modal.db_icon_label.custom": "自訂",
+ "connection_modal.db_type.custom": "自訂",
"connection_modal.db_type_hint.custom": "使用自訂驅動和 DSN 連線資料庫。",
"connection_modal.db_type_hint.file": "選擇本機 SQLite 或 DuckDB 資料庫檔案。",
"connection_modal.db_type_hint.mongodb": "連線 MongoDB 單節點、Replica Set 或 SRV 位址。",
"connection_modal.db_type_hint.redis": "連線 Redis 單機或 Redis Cluster。",
"connection_modal.db_type_hint.standard": "填寫主機、連接埠、認證資訊和可選資料庫。",
- "connection_modal.db_type.custom": "自訂",
"connection_modal.driver.current": "目前",
"connection_modal.error.unknown": "未知錯誤",
"connection_modal.error.unknown_exception": "未知錯誤",
@@ -3084,11 +3142,11 @@
"connection_modal.field.connection_name": "連線名稱",
"connection_modal.field.connection_timeout_seconds": "連線逾時(秒)",
"connection_modal.field.connection_timeout_seconds_ascii": "連線逾時(秒)",
- "connection_modal.field.default_database_optional": "預設連線資料庫(選填)",
"connection_modal.field.defaultDatabase.placeholder": "例如:appdb",
+ "connection_modal.field.default_database_optional": "預設連線資料庫(選填)",
"connection_modal.field.display_databases_optional": "顯示資料庫(選填)",
- "connection_modal.field.driver_name": "驅動名稱",
"connection_modal.field.driver.placeholder": "例如: mysql, postgres",
+ "connection_modal.field.driver_name": "驅動名稱",
"connection_modal.field.dsn": "DSN",
"connection_modal.field.dsn.placeholder": "例如: user:pass@tcp(localhost:3306)/dbname?charset=utf8",
"connection_modal.field.file_path_absolute": "檔案路徑(絕對路徑)",
@@ -3132,8 +3190,8 @@
"connection_modal.field.replica_set_username_optional": "Replica Set 使用者名稱(選填)",
"connection_modal.field.replica_username_optional": "從庫使用者名稱(選填)",
"connection_modal.field.save_password": "儲存密碼",
- "connection_modal.field.service_name": "服務名稱",
"connection_modal.field.serviceName.placeholder": "例如:ORCLPDB1",
+ "connection_modal.field.service_name": "服務名稱",
"connection_modal.field.ssh_host": "SSH 主機",
"connection_modal.field.ssh_password": "SSH 密碼",
"connection_modal.field.ssh_user": "SSH 使用者",
@@ -3166,12 +3224,6 @@
"connection_modal.jvm.agent_description": "透過 GoNavi Agent 連線,適用於無法直接連線的網路環境。",
"connection_modal.jvm.agent_help": "GoNavi Agent 服務的基礎 URL。",
"connection_modal.jvm.agent_url": "Agent 位址",
- "connection_modal.jvm.diagnostic_api_key_optional": "診斷 API 金鑰(選填)",
- "connection_modal.jvm.diagnostic_description": "啟用可選診斷命令,用於 JVM 故障排查。",
- "connection_modal.jvm.diagnostic_disabled_hint": "診斷增強未啟用,僅在需要執行階段排查時開啟。",
- "connection_modal.jvm.diagnostic_timeout_seconds": "診斷逾時(秒)",
- "connection_modal.jvm.diagnostic_title": "診斷增強",
- "connection_modal.jvm.diagnostic_transport": "診斷傳輸",
"connection_modal.jvm.diagnostic.agent_bridge_description": "使用 GoNavi Agent Bridge 診斷 Endpoint。",
"connection_modal.jvm.diagnostic.arthas_tunnel_description": "透過 Arthas Tunnel 存取目標 JVM。",
"connection_modal.jvm.diagnostic.arthas_tunnel_help": "Arthas Tunnel 伺服器的基礎 URL。",
@@ -3190,6 +3242,12 @@
"connection_modal.jvm.diagnostic.trace_commands_description": "允許 trace 與 watch 等會增加執行階段負載的命令。",
"connection_modal.jvm.diagnostic.transport.agent_bridge": "Agent Bridge",
"connection_modal.jvm.diagnostic.transport.arthas_tunnel": "Arthas Tunnel",
+ "connection_modal.jvm.diagnostic_api_key_optional": "診斷 API 金鑰(選填)",
+ "connection_modal.jvm.diagnostic_description": "啟用可選診斷命令,用於 JVM 故障排查。",
+ "connection_modal.jvm.diagnostic_disabled_hint": "診斷增強未啟用,僅在需要執行階段排查時開啟。",
+ "connection_modal.jvm.diagnostic_timeout_seconds": "診斷逾時(秒)",
+ "connection_modal.jvm.diagnostic_title": "診斷增強",
+ "connection_modal.jvm.diagnostic_transport": "診斷傳輸",
"connection_modal.jvm.endpoint_api_key_optional": "Endpoint API 金鑰(選填)",
"connection_modal.jvm.endpoint_description": "使用服務暴露的 Endpoint 連線,而不是直接連線 JMX。",
"connection_modal.jvm.endpoint_help": "JVM 管理 Endpoint 的基礎 URL。",
@@ -3315,7 +3373,6 @@
"connection_modal.messageQueue.rocketmq.topology.single.description": "只設定一個 NameServer,適合本機或簡單環境。",
"connection_modal.messageQueue.rocketmq.topology.single.label": "單 NameServer",
"connection_modal.messageQueue.topology.cluster.label": "叢集模式",
- "connection_modal.mongodb.auth_mechanism": "認證機制",
"connection_modal.mongodb.auth.auto": "自動",
"connection_modal.mongodb.auth.auto_description": "由驅動自動選擇認證機制。",
"connection_modal.mongodb.auth.aws_iam_description": "使用 AWS IAM 認證,請在執行環境中提供 AWS IAM 憑據。",
@@ -3323,10 +3380,11 @@
"connection_modal.mongodb.auth.none_description": "不使用 MongoDB 認證連線。",
"connection_modal.mongodb.auth.scram_sha1_description": "使用 SCRAM-SHA-1 認證。",
"connection_modal.mongodb.auth.scram_sha256_description": "使用 SCRAM-SHA-256 認證。",
+ "connection_modal.mongodb.auth_mechanism": "認證機制",
"connection_modal.mongodb.discovery.current": "目前",
- "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV 與 SSH Tunnel 同時啟用時,可能依賴本機 DNS 解析能力",
"connection_modal.mongodb.discovery.srv.description": "使用 mongodb+srv,由 DNS 探索目標節點。",
"connection_modal.mongodb.discovery.srv.label": "SRV 位址",
+ "connection_modal.mongodb.discovery.srv_ssh_warning": "SRV 與 SSH Tunnel 同時啟用時,可能依賴本機 DNS 解析能力",
"connection_modal.mongodb.discovery.standard.description": "使用 host:port 直連或副本集節點清單。",
"connection_modal.mongodb.discovery.standard.label": "標準位址",
"connection_modal.mongodb.members.health": "健康",
@@ -3530,11 +3588,11 @@
"connection_modal.switch.on": "開",
"connection_modal.table.health": "健康",
"connection_modal.table.role": "角色",
+ "connection_modal.test.redis_database_list_failure": "連線成功,但取得 Redis 資料庫清單失敗:{{detail}}",
+ "connection_modal.test.redis_database_list_timeout": "連線成功,但拉取 Redis 資料庫清單逾時(>{{seconds}} 秒)",
"connection_modal.test_error.description": "查看後端回傳的完整錯誤資訊。",
"connection_modal.test_error.empty": "沒有錯誤詳情",
"connection_modal.test_error.title": "連線測試失敗原因",
- "connection_modal.test.redis_database_list_failure": "連線成功,但取得 Redis 資料庫清單失敗:{{detail}}",
- "connection_modal.test.redis_database_list_timeout": "連線成功,但拉取 Redis 資料庫清單逾時(>{{seconds}} 秒)",
"connection_modal.title.create": "新增 {{type}} 連線",
"connection_modal.title.create_description": "填寫連線設定並儲存。",
"connection_modal.title.edit": "編輯連線",
@@ -3578,64 +3636,6 @@
"connection_modal.validation.tunnel_host_required": "請輸入 HTTP Tunnel 主機",
"connection_modal.validation.tunnel_port_required": "請輸入 HTTP Tunnel 連接埠",
"connection_modal.validation.username_required": "請輸入使用者名稱",
- "connection.backend.action.apply_result_changes": "提交結果修改",
- "connection.backend.action.clear_table": "清空資料表資料",
- "connection.backend.action.create_database": "建立資料庫",
- "connection.backend.action.create_schema": "建立結構描述",
- "connection.backend.action.data_sync_structure": "同步目標結構",
- "connection.backend.action.data_sync_write": "寫入資料同步結果",
- "connection.backend.action.drop_database": "刪除資料庫",
- "connection.backend.action.drop_function_or_procedure": "刪除函式或預存程序",
- "connection.backend.action.drop_schema": "刪除結構描述",
- "connection.backend.action.drop_table": "刪除資料表",
- "connection.backend.action.drop_view": "刪除檢視",
- "connection.backend.action.import_data": "匯入資料",
- "connection.backend.action.preview_result_changes": "預覽結果修改",
- "connection.backend.action.rename_database": "重新命名資料庫",
- "connection.backend.action.rename_schema": "重新命名結構描述",
- "connection.backend.action.rename_table": "重新命名資料表",
- "connection.backend.action.rename_view": "重新命名檢視",
- "connection.backend.action.truncate_table": "截斷資料表",
- "connection.backend.error.readonly_action_blocked": "目前連線已啟用正式保護,禁止執行{{action}}",
- "connection.copy_suffix": " - 副本",
- "connection.delete": "刪除連線",
- "connection.edit": "編輯連線",
- "connection.new": "新增連線",
- "connection.oceanbase.error.unsupported_protocol": "OceanBase 目前僅支援 MySQL/Oracle 租戶協議,不支援「{{value}}」;請改用 MySQL 或 Oracle。",
- "connection.sidebar.delete.backendUnavailable": "刪除連線失敗:後端介面不可用",
- "connection.sidebar.delete.confirmContent": "確定要刪除連線 \"{{name}}\" 嗎?",
- "connection.sidebar.delete.confirmTitle": "確認刪除",
- "connection.sidebar.delete.failureFallback": "刪除連線失敗",
- "connection.sidebar.delete.success": "已刪除連線",
- "connection.sidebar.disconnect.success": "已中斷連線",
- "connection.sidebar.duplicate.backendUnavailable": "複製連線失敗:後端介面不可用",
- "connection.sidebar.duplicate.failureFallback": "複製連線失敗",
- "connection.sidebar.duplicate.noResult": "複製連線失敗:後端未回傳結果",
- "connection.sidebar.duplicate.success": "已複製連線: {{name}}",
- "connection.sidebar.group.badge": "分組",
- "connection.sidebar.group.collapseAria": "收合連線分組 {{name}}",
- "connection.sidebar.group.delete": "刪除分組",
- "connection.sidebar.group.deleteConfirmContent": "確定要刪除分組 \"{{name}}\" 嗎?這不會刪除其中的連線。",
- "connection.sidebar.group.deleteConfirmTitle": "確認刪除",
- "connection.sidebar.group.edit": "編輯分組",
- "connection.sidebar.group.expandAria": "展開連線分組 {{name}}",
- "connection.sidebar.group.meta": "{{count}} 個連線 · 連線分組",
- "connection.sidebar.group.untitled": "未命名分組",
- "connection.sidebar.menu.copy": "複製連線",
- "connection.sidebar.menu.createDatabase": "新增資料庫",
- "connection.sidebar.menu.current": "目前",
- "connection.sidebar.menu.delete": "刪除連線",
- "connection.sidebar.menu.disconnect": "中斷連線",
- "connection.sidebar.menu.groupSection": "連線分組",
- "connection.sidebar.menu.hostBadge": "HOST",
- "connection.sidebar.menu.hostFallback": "位址未設定",
- "connection.sidebar.menu.moveOutTag": "移出標籤",
- "connection.sidebar.menu.moveToTag": "移至標籤",
- "connection.sidebar.menu.moveToUngrouped": "移出分組",
- "connection.sidebar.menu.refresh": "重新整理連線",
- "connection.sidebar.menu.section": "連線",
- "connection.test": "測試連線",
- "connection.unnamed": "未命名連線",
"data_export.action.clear": "清空",
"data_export.action.clear_progress": "清空目前進度",
"data_export.action.select_all": "全選",
@@ -3775,6 +3775,12 @@
"data_grid.cell_editor.now": "此刻",
"data_grid.cell_editor.title": "編輯儲存格",
"data_grid.cell_editor.title_with_column": "編輯儲存格:{{column}}",
+ "data_grid.column.comment_tooltip": "註解:{{comment}}",
+ "data_grid.column.drag_tooltip": "拖曳調整欄位順序",
+ "data_grid.column.foreign_key_jump_title": "跳轉到外鍵表:{{tableName}}",
+ "data_grid.column.foreign_key_tooltip": "外鍵:{{target}}",
+ "data_grid.column.resize_tooltip": "拖曳調整欄寬,按兩下自動適配",
+ "data_grid.column.type_tooltip": "型別:{{type}}",
"data_grid.column_quick_find.placeholder": "跳到欄位列...",
"data_grid.column_quick_find.tooltip": "輸入欄位名稱,按 Enter 或點定位按鈕即可跳到對應欄",
"data_grid.column_settings.column_visibility": "欄位顯示",
@@ -3796,12 +3802,6 @@
"data_grid.column_settings.show_all": "全部顯示",
"data_grid.column_settings.show_comments": "在表頭顯示欄位註解",
"data_grid.column_settings.show_types": "在表頭顯示欄位型別",
- "data_grid.column.comment_tooltip": "註解:{{comment}}",
- "data_grid.column.drag_tooltip": "拖曳調整欄位順序",
- "data_grid.column.foreign_key_jump_title": "跳轉到外鍵表:{{tableName}}",
- "data_grid.column.foreign_key_tooltip": "外鍵:{{target}}",
- "data_grid.column.resize_tooltip": "拖曳調整欄寬,按兩下自動適配",
- "data_grid.column.type_tooltip": "型別:{{type}}",
"data_grid.context_menu.auto_fit_column": "依內容自動調整欄寬",
"data_grid.context_menu.clear_column_sort": "取消此欄位排序",
"data_grid.context_menu.column_display_section": "欄位顯示",
@@ -3869,7 +3869,6 @@
"data_grid.export.no_selection_prompt": "未選取列,請選擇匯出範圍:",
"data_grid.export.options_title": "匯出選項",
"data_grid.export.query_result_title": "匯出查詢結果",
- "data_grid.export.scope_prompt": "請選擇匯出範圍:",
"data_grid.export.scope.all_results_cached": "全部結果(目前快取 {{count}} 筆)",
"data_grid.export.scope.all_results_cached_description": "當前查詢缺少可重放 SQL 時,將匯出目前快取中的全部結果。",
"data_grid.export.scope.all_results_requery": "全部結果(重新查詢)",
@@ -3884,6 +3883,7 @@
"data_grid.export.scope.selected_rows": "已選列",
"data_grid.export.scope.selected_rows_count": "已選列({{count}} 筆)",
"data_grid.export.scope.selected_rows_description": "僅匯出目前結果集中已勾選的資料列。",
+ "data_grid.export.scope_prompt": "請選擇匯出範圍:",
"data_grid.export.selected_rows": "匯出已選列({{count}} 列)",
"data_grid.filter.add_condition": "新增條件",
"data_grid.filter.add_sort": "新增排序",
@@ -4053,10 +4053,10 @@
"data_grid.pagination.jump_action": "跳",
"data_grid.pagination.jump_aria": "跳轉頁碼",
"data_grid.pagination.jump_label": "跳頁",
- "data_grid.pagination.page_size_aria": "每頁列數",
- "data_grid.pagination.page_size_option": "{{count}} 列 / 頁",
"data_grid.pagination.page.current": "第 {{current}} 頁",
"data_grid.pagination.page.known": "第 {{current}} / {{totalPages}} 頁",
+ "data_grid.pagination.page_size_aria": "每頁列數",
+ "data_grid.pagination.page_size_option": "{{count}} 列 / 頁",
"data_grid.pagination.result_set": "結果集",
"data_grid.pagination.summary.approximate": "目前 {{current}} 列 / 約 {{total}} 列",
"data_grid.pagination.summary.cancelled": "目前 {{current}} 列 / 計數已停止",
@@ -4592,14 +4592,6 @@
"data_sync.step.configure": "配置源與目標",
"data_sync.step.result": "執行結果",
"data_sync.step.select_tables": "選擇表",
- "data_sync.table_picker.help": "請選擇需要同步的表:",
- "data_sync.table_picker.item_unit": "項",
- "data_sync.table_picker.items_unit": "項",
- "data_sync.table_picker.not_found": "暫無資料",
- "data_sync.table_picker.search_placeholder": "搜尋表...",
- "data_sync.table_picker.selected_title": "已選表",
- "data_sync.table_picker.show_same": "显示相同表",
- "data_sync.table_picker.source_title": "來源表",
"data_sync.table.delete": "刪除",
"data_sync.table.insert": "插入",
"data_sync.table.plan": "計畫",
@@ -4611,6 +4603,14 @@
"data_sync.table.target_missing": "不存在",
"data_sync.table.target_table": "目標表",
"data_sync.table.update": "更新",
+ "data_sync.table_picker.help": "請選擇需要同步的表:",
+ "data_sync.table_picker.item_unit": "項",
+ "data_sync.table_picker.items_unit": "項",
+ "data_sync.table_picker.not_found": "暫無資料",
+ "data_sync.table_picker.search_placeholder": "搜尋表...",
+ "data_sync.table_picker.selected_title": "已選表",
+ "data_sync.table_picker.show_same": "显示相同表",
+ "data_sync.table_picker.source_title": "來源表",
"data_sync.title.compare_result": "對比結果",
"data_sync.title.execution_log": "執行日誌",
"data_sync.title.migration": "跨資料源遷移",
@@ -4856,9 +4856,9 @@
"definition_viewer.error.connection_not_found": "找不到資料庫連線",
"definition_viewer.error.event_name_empty": "事件名稱為空",
"definition_viewer.error.load_failed": "載入失敗",
+ "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.query_failed": "查詢定義失敗",
"definition_viewer.error.query_failed_detail": "查詢定義失敗:{{detail}}",
- "definition_viewer.error.package_name_empty": "Package name is empty",
"definition_viewer.error.routine_name_empty": "函式/預存程序名稱為空",
"definition_viewer.error.sequence_name_empty": "Sequence name is empty",
"definition_viewer.error.view_name_empty": "檢視名稱為空",
@@ -4889,6 +4889,7 @@
"dev.perf_data_grid.ui_version.legacy_short": "舊版",
"dev.perf_data_grid.ui_version.v2": "新版 UI",
"dev.perf_data_grid.ui_version.v2_short": "新版",
+ "driver.guidance.customConnectionDriverHelp": "已支援: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase;別名支援 postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。請填寫 GoNavi 已註冊的 Go database/sql 驅動名稱,不要直接填寫系統 ODBC/JDBC 驅動名稱,也不要匯入 JDBC Jar。",
"driver_manager.action.close": "關閉",
"driver_manager.action.import_directory": "匯入驅動目錄",
"driver_manager.action.import_package": "匯入驅動包",
@@ -5088,10 +5089,6 @@
"driver_manager.import.single_file_help": "行內「匯入驅動包」僅用於單個驅動檔案/總包(如 `mariadb-driver-agent`、`mariadb-driver-agent.exe`、`GoNavi-DriverAgents.zip`),不支援直接匯入 JDBC Jar;批次匯入請使用上方「匯入驅動目錄」。",
"driver_manager.local_source.directory": "目錄",
"driver_manager.local_source.file": "檔案",
- "driver_manager.log_modal.empty": "目前驅動暫無操作日誌。",
- "driver_manager.log_modal.executable_path": "驅動可執行檔:{{path}}",
- "driver_manager.log_modal.install_dir": "安裝目錄:{{path}}",
- "driver_manager.log_modal.title": "驅動日誌 - {{name}}",
"driver_manager.log.done_auto_install": "自動安裝完成{{version}}",
"driver_manager.log.done_local_import": "本機匯入安裝完成{{version}}",
"driver_manager.log.done_remove": "驅動移除完成",
@@ -5102,6 +5099,10 @@
"driver_manager.log.start_auto_install": "開始自動安裝",
"driver_manager.log.start_local_import": "開始本機匯入{{version}}({{source}}):{{path}}",
"driver_manager.log.start_remove": "開始移除驅動",
+ "driver_manager.log_modal.empty": "目前驅動暫無操作日誌。",
+ "driver_manager.log_modal.executable_path": "驅動可執行檔:{{path}}",
+ "driver_manager.log_modal.install_dir": "安裝目錄:{{path}}",
+ "driver_manager.log_modal.title": "驅動日誌 - {{name}}",
"driver_manager.message.directory_import_completed": "目錄匯入完成{{mode}}:成功 {{success}}{{skip}}",
"driver_manager.message.directory_import_completed_with_failure": "目錄匯入完成{{mode}}:成功 {{success}},失敗 {{failed}}{{skip}}",
"driver_manager.message.directory_import_failed": "目錄匯入失敗{{mode}}:失敗 {{failed}}{{skip}}",
@@ -5136,9 +5137,9 @@
"driver_manager.message.select_local_directory_failed_detail": "選擇本機驅動包目錄失敗:{{detail}}",
"driver_manager.message.select_local_file_failed": "選擇本機驅動包檔案失敗",
"driver_manager.message.select_local_file_failed_detail": "選擇本機驅動包檔案失敗:{{detail}}",
- "driver_manager.message.skip_suffix": ",{{items}}",
"driver_manager.message.skip.dedupe": "去重略過 {{count}}",
"driver_manager.message.skip.slim": "精簡版略過 {{count}}",
+ "driver_manager.message.skip_suffix": ",{{items}}",
"driver_manager.network.alert.download_chain_unreachable": "重要提醒:驅動下載鏈路網域不可達",
"driver_manager.network.alert.download_network_unreachable": "重要提醒:驅動下載網路不可達",
"driver_manager.network.chain_alert.allow_hosts": "若仍失敗,請在代理規則放行:{{hosts}};若仍無法調整規則,再考慮開啟 TUN 模式。",
@@ -5227,7 +5228,6 @@
"driver_manager.version.switch_pending": "目前已安裝 {{installedVersion}},已選擇 {{targetVersion}},點擊「切換版本」即可生效",
"driver_manager.version.target_fallback": "目標版本",
"driver_manager.version.unlabeled": "未標註版本",
- "driver.guidance.customConnectionDriverHelp": "已支援: mysql, starrocks, oceanbase, postgres, opengauss, sqlite, oracle, dm, kingbase;別名支援 postgresql/pgx、open_gauss/open-gauss、dm8、kingbase8/kingbasees/kingbasev8。請填寫 GoNavi 已註冊的 Go database/sql 驅動名稱,不要直接填寫系統 ODBC/JDBC 驅動名稱,也不要匯入 JDBC Jar。",
"file.backend.dialog.export_connections": "匯出連線",
"file.backend.dialog.export_data": "匯出資料",
"file.backend.dialog.export_database_sql": "匯出 {{database}} (SQL)",
@@ -5399,6 +5399,123 @@
"import_preview.status.importing": "正在匯入資料...",
"import_preview.status.loading_preview": "正在載入預覽資料...",
"import_preview.title": "匯入資料預覽",
+ "jvm.backend.capability.reason.read_only": "目前連線為唯讀",
+ "jvm.backend.connection_error.agent.base_url_invalid.help": "請填寫完整的 `http://` 或 `https://` 位址,例如 `http://127.0.0.1:19090/gonavi/agent/jvm`。",
+ "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 連線失敗:Agent Base URL 格式不合法。",
+ "jvm.backend.connection_error.agent.base_url_required": "Agent 連線失敗:未填寫 Agent Base URL。",
+ "jvm.backend.connection_error.agent.connection_refused.help": "請確認 Java 服務已透過 `-javaagent` 啟動 GoNavi Agent,並檢查 Base URL、連接埠對映與防火牆。",
+ "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 連線失敗:目標 Agent 管理連接埠未監聽,或目前位址無法連線。",
+ "jvm.backend.connection_error.agent.forbidden.help": "請確認目前用戶端來源、鑑權設定和 Agent 存取策略允許 GoNavi 存取。",
+ "jvm.backend.connection_error.agent.forbidden.summary": "Agent 連線失敗:目前請求被 Agent 拒絕。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.help": "請將 Agent Base URL 改成以 `http://` 或 `https://` 開頭的位址。",
+ "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 連線失敗:目前只支援 HTTP 或 HTTPS 協定。",
+ "jvm.backend.connection_error.agent.timeout.help": "請確認目標位址可連線、Agent 已完成啟動,並視需要增加連線逾時時間。",
+ "jvm.backend.connection_error.agent.timeout.summary": "Agent 連線失敗:存取 Agent 管理連接埠逾時。",
+ "jvm.backend.connection_error.agent.unauthorized.help": "請檢查連線中的 Agent API Key 是否與目標服務啟動參數一致。",
+ "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 連線失敗:Agent 已回應,但目前 API Key 無效或缺失。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.help": "請填寫完整的 `http://` 或 `https://` 位址,並指向實作 GoNavi JVM HTTP 合約的管理介面根路徑,例如 `http://127.0.0.1:19090/manage/jvm`。",
+ "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 連線失敗:Endpoint Base URL 格式不合法。",
+ "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 連線失敗:未填寫 Endpoint Base URL。",
+ "jvm.backend.connection_error.endpoint.connection_refused.help": "請確認 Base URL 指向實作 GoNavi JVM HTTP 合約的管理介面,並檢查服務監聽、連接埠對映與防火牆。",
+ "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 連線失敗:目標管理介面未監聽,或目前位址無法連線。",
+ "jvm.backend.connection_error.endpoint.forbidden.help": "請確認目前用戶端來源、鑑權設定和存取策略允許 GoNavi 存取該管理介面。",
+ "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 連線失敗:目前請求被目標管理介面拒絕。",
+ "jvm.backend.connection_error.endpoint.not_found.help": "請確認 Base URL 指向 JVM 管理介面根路徑,而不是一般業務介面、健康檢查位址或閘道首頁。",
+ "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 連線失敗:目標位址已回應,但找不到 GoNavi JVM 管理介面。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "請將 Endpoint Base URL 改成以 `http://` 或 `https://` 開頭的位址。",
+ "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 連線失敗:目前只支援 HTTP 或 HTTPS 協定。",
+ "jvm.backend.connection_error.endpoint.timeout.help": "請確認 Base URL 可連線、目標服務已完成啟動,並視需要增加連線逾時時間。",
+ "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 連線失敗:存取目標管理介面逾時。",
+ "jvm.backend.connection_error.endpoint.unauthorized.help": "請檢查連線中的 Endpoint API Key 是否與目標服務設定一致。",
+ "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 連線失敗:目標管理介面已回應,但目前 API Key 無效或缺失。",
+ "jvm.backend.connection_error.generic": "JVM 連線失敗",
+ "jvm.backend.connection_error.jmx.auth.help": "請確認目標 JMX 是否關閉認證;如果必須認證,需要補充使用者名稱/密碼後再連線。",
+ "jvm.backend.connection_error.jmx.auth.summary": "JMX 連線失敗:{{target}} 需要認證,或目前憑證不可用。",
+ "jvm.backend.connection_error.jmx.connection_refused.help": "請確認目標 JVM 已開啟遠端 JMX,並檢查主機、防火牆、連接埠對映和 SSH/代理設定。",
+ "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 連線失敗:無法連線到 {{target}},對應連接埠沒有監聽或目前網路無法連線。",
+ "jvm.backend.connection_error.jmx.connection_reset.help": "請確認填寫的是 JVM 真正對外暴露的 JMX 連接埠,而不是業務連接埠、除錯連接埠或被代理轉發的連接埠。",
+ "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 連線失敗:{{target}} 上的服務主動中斷連線,目前連接埠不是相容的標準 JMX RMI 連接埠。",
+ "jvm.backend.connection_error.jmx.host_required": "JMX 連線失敗:未填寫主機位址。",
+ "jvm.backend.connection_error.jmx.java_missing.help": "請先安裝 JRE/JDK,或透過環境變數 `GONAVI_JMX_JAVA_BIN` 指向正確的 `java` 可執行檔。",
+ "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 連線失敗:目前機器未找到 `java` runtime,GoNavi 無法啟動 JMX helper。",
+ "jvm.backend.connection_error.jmx.no_such_object.help": "這通常代表填到了 RMI 註冊連接埠、除錯連接埠或其他 Java 服務連接埠。請檢查 `jmxremote.port` 和 `jmxremote.rmi.port` 設定是否正確。",
+ "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 連線失敗:{{target}} 上雖然有 RMI 服務,但不是可用的 JMX RMIServer 連接埠。",
+ "jvm.backend.connection_error.jmx.non_jrmp.help": "請改填應用實際暴露的 JMX 連接埠,而不是業務 `server.port`。如果服務只開啟 `-Dcom.sun.management.jmxremote`,但沒有設定 `jmxremote.port`,也無法直接遠端連線。",
+ "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 連線失敗:{{target}} 不是標準 JMX 遠端管理連接埠,目前更像一般業務連接埠或 HTTP 連接埠。",
+ "jvm.backend.connection_error.jmx.port_invalid": "JMX 連線失敗:連接埠無效,請填寫 1-65535 之間的有效連接埠。",
+ "jvm.backend.connection_error.jmx.timeout.help": "請確認連接埠可連線、網路未被攔截,並視需要增加連線逾時時間。",
+ "jvm.backend.connection_error.jmx.timeout.summary": "JMX 連線失敗:連線 {{target}} 逾時。",
+ "jvm.backend.connection_error.suggestion": "建議:{{detail}}",
+ "jvm.backend.connection_error.technical_detail": "技術細節:{{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel 位址格式不正確:{{detail}}",
+ "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel 位址不能為空",
+ "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "目前 Arthas Tunnel 會話的活動命令與待取消命令不一致",
+ "jvm.backend.diagnostic.arthas.command_already_running": "目前 Arthas Tunnel 會話已有命令在執行,請先等待完成或取消",
+ "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel 命令已終止",
+ "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel 命令執行逾時,{{timeout}} 內未完成",
+ "jvm.backend.diagnostic.arthas.connect_canceled": "建立 Arthas Tunnel WebSocket 連線已終止",
+ "jvm.backend.diagnostic.arthas.connect_failed": "建立 Arthas Tunnel WebSocket 連線失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.connect_timeout": "建立 Arthas Tunnel WebSocket 連線逾時,{{timeout}} 內未收到回應",
+ "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 連線已關閉:{{detail}}",
+ "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 連線已關閉:code={{code}}",
+ "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 連線尚未建立完成,請稍後重試",
+ "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 連線失敗:HTTP {{status}}",
+ "jvm.backend.diagnostic.arthas.no_running_command": "目前 Arthas Tunnel 會話沒有正在執行的命令",
+ "jvm.backend.diagnostic.arthas.read_canceled": "讀取 Arthas Tunnel 輸出已終止",
+ "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel 讀取逾時設定失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.read_failed": "讀取 Arthas Tunnel 輸出失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.read_timeout": "讀取 Arthas Tunnel 輸出逾時,{{timeout}} 內未收到回應",
+ "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel 請求編碼失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel 僅支援 http/https/ws/wss 位址:{{scheme}}",
+ "jvm.backend.diagnostic.arthas.send_canceled": "向 Arthas Tunnel 傳送終端指令已終止",
+ "jvm.backend.diagnostic.arthas.send_failed": "向 Arthas Tunnel 傳送終端指令失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.send_timeout": "向 Arthas Tunnel 傳送終端指令逾時,{{timeout}} 內未收到回應",
+ "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel 會話設定已變更,請重新建立診斷會話",
+ "jvm.backend.diagnostic.arthas.session_missing": "診斷會話不存在,請重新建立 Arthas Tunnel 會話",
+ "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel 需要填寫目標實例標識(targetId / agentId)",
+ "jvm.backend.diagnostic.arthas.target_not_found": "找不到目標實例,請確認 targetId / agentId 是否填寫正確,且對應 tunnel client 已上線",
+ "jvm.backend.diagnostic.arthas.target_not_found_with_id": "找不到目標實例 {{target}},請確認 targetId / agentId 是否填寫正確,且對應 tunnel client 已上線",
+ "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 終端指令編碼失敗:{{detail}}",
+ "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel 寫入逾時設定失敗:{{detail}}",
+ "jvm.backend.diagnostic.error.audit_write_blocked": "診斷稽核記錄寫入失敗,已阻止命令執行: {{detail}}",
+ "jvm.backend.diagnostic.error.cancel_identifiers_required": "取消命令缺少 sessionId 或 commandId",
+ "jvm.backend.diagnostic.error.command_required": "診斷命令不能為空",
+ "jvm.backend.diagnostic.error.disabled": "目前連線未啟用 JVM 診斷增強模式",
+ "jvm.backend.diagnostic.error.execute_canceled": "診斷執行請求已終止:{{detail}}",
+ "jvm.backend.diagnostic.error.session_id_required": "診斷會話 ID 不能為空,請先建立會話",
+ "jvm.backend.diagnostic.error.transport_unsupported": "不支援的 JVM 診斷傳輸模式:{{transport}}",
+ "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas 命令已終止",
+ "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas 命令執行完成",
+ "jvm.backend.diagnostic.message.cancel_requested": "已傳送取消請求,等待診斷橋接端結束命令",
+ "jvm.backend.diagnostic.message.command_completed": "診斷命令執行完成",
+ "jvm.backend.diagnostic.policy.multiline_not_supported": "診斷命令不支援換行或多命令輸入",
+ "jvm.backend.diagnostic.policy.mutating_not_allowed": "目前連線未開放高風險診斷命令:{{command}}",
+ "jvm.backend.diagnostic.policy.observe_not_allowed": "目前連線未開放觀察類診斷命令:{{command}}",
+ "jvm.backend.diagnostic.policy.read_only_observe_only": "目前連線為唯讀模式,僅允許觀察類診斷命令",
+ "jvm.backend.diagnostic.policy.trace_not_allowed": "目前連線未開放追蹤類診斷命令:{{command}}",
+ "jvm.backend.diagnostic.warning.audit_write_failed": "稽核記錄寫入失敗: {{detail}}",
+ "jvm.backend.error.audit_write_blocked": "稽核記錄寫入失敗,已阻止 JVM 變更: {{detail}}",
+ "jvm.backend.error.change_action_required": "JVM 變更操作不能為空",
+ "jvm.backend.error.change_blocked_by_guard": "目前變更已被 Guard 攔截",
+ "jvm.backend.error.change_blocked_read_only": "目前連線為唯讀,禁止寫入",
+ "jvm.backend.error.change_confirmation_token_failed": "產生 JVM 變更確認權杖失敗: {{detail}}",
+ "jvm.backend.error.change_reason_required": "JVM 變更原因不能為空",
+ "jvm.backend.error.change_resource_id_required": "JVM 資源 ID 不能為空",
+ "jvm.backend.error.confirmation_token_expired": "確認權杖已過期,請重新預覽並確認",
+ "jvm.backend.error.confirmation_token_invalid": "確認權杖無效,請重新預覽並確認",
+ "jvm.backend.error.confirmation_token_missing": "缺少確認權杖,請先完成預覽確認",
+ "jvm.backend.error.disallowed_mode": "目前連線不允許使用 {{mode}} 模式",
+ "jvm.backend.error.preview_confirmation_missing": "預覽確認權杖缺失,請重新預覽後再提交",
+ "jvm.backend.error.preview_context_hash_failed": "產生 JVM 預覽上下文失敗: {{detail}}",
+ "jvm.backend.error.preview_payload_hash_failed": "產生 JVM 預覽 Payload 摘要失敗: {{detail}}",
+ "jvm.backend.error.resource_path_invalid": "JVM 資源路徑無效: {{detail}}",
+ "jvm.backend.message.connect_success": "JVM 連線成功",
+ "jvm.backend.monitoring.error.session_not_found": "找不到 {{connectionId}} {{providerMode}} 的 JVM 監控會話",
+ "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 監控快照暫未支援",
+ "jvm.backend.monitoring.warning.sample_auto_stopped": "監控採樣連續失敗 {{count}} 次,已自動停止本次監控會話",
+ "jvm.backend.separator.message_warning": ";",
+ "jvm.backend.warning.failed_audit_write_failed": "失敗稽核寫入失敗: {{detail}}",
+ "jvm.backend.warning.terminal_audit_write_failed": "終態稽核寫入失敗: {{detail}}",
"jvm_ai_plan.actions.description": ":{{description}}",
"jvm_ai_plan.actions.field_separator": "、",
"jvm_ai_plan.actions.label": " ({{label}})",
@@ -5476,6 +5593,8 @@
"jvm_diagnostic.ai_plan.default_reason": "AI 診斷計畫:{{intent}}",
"jvm_diagnostic.ai_plan.error.transport_mismatch": "AI 計畫的診斷 transport 為 {{planTransport}},與目前控制台 {{currentTransport}} 不一致,請重新產生計畫後再套用。",
"jvm_diagnostic.ai_plan.message.filled": "AI 診斷計畫已回填到控制台",
+ "jvm_diagnostic.capability.empty.description": "能力檢查只讀取通道權限和命令策略,不會建立會話或執行命令。",
+ "jvm_diagnostic.capability.empty.title": "尚未檢查能力",
"jvm_diagnostic.capability_result.mutating_allowed": "高風險命令",
"jvm_diagnostic.capability_result.observe_allowed": "觀察命令",
"jvm_diagnostic.capability_result.observe_denied": "禁止觀察",
@@ -5485,8 +5604,6 @@
"jvm_diagnostic.capability_result.streaming_unsupported": "不支援串流",
"jvm_diagnostic.capability_result.title": "能力檢查結果",
"jvm_diagnostic.capability_result.trace_allowed": "追蹤命令",
- "jvm_diagnostic.capability.empty.description": "能力檢查只讀取通道權限和命令策略,不會建立會話或執行命令。",
- "jvm_diagnostic.capability.empty.title": "尚未檢查能力",
"jvm_diagnostic.command_input.command_description": "輸入 Arthas/診斷命令,例如 thread -n 5、dashboard 或 jvm;下方範本可一鍵填入。",
"jvm_diagnostic.command_input.command_label": "診斷命令",
"jvm_diagnostic.command_input.description": "支援自動完成。按 Ctrl/Cmd + Enter 執行。",
@@ -5648,6 +5765,8 @@
"jvm_diagnostic.presentation.source.manual": "手動輸入",
"jvm_diagnostic.presentation.transport.agent_bridge": "Agent Bridge",
"jvm_diagnostic.presentation.transport.arthas_tunnel": "Arthas Tunnel",
+ "jvm_diagnostic.session.default_reason": "從控制台啟動會話",
+ "jvm_diagnostic.session.default_title": "JVM 診斷控制台",
"jvm_diagnostic.session_capability.action.clear_output": "清空輸出",
"jvm_diagnostic.session_capability.action.refresh_history": "重新整理歷史",
"jvm_diagnostic.session_capability.description": "目前通道、權限與快速維護",
@@ -5658,8 +5777,6 @@
"jvm_diagnostic.session_capability.status.no_session": "未建會話",
"jvm_diagnostic.session_capability.status.session_established": "會話已建立",
"jvm_diagnostic.session_capability.title": "會話與能力",
- "jvm_diagnostic.session.default_reason": "從控制台啟動會話",
- "jvm_diagnostic.session.default_title": "JVM 診斷控制台",
"jvm_diagnostic.workbench.action.cancel_command": "取消命令",
"jvm_diagnostic.workbench.action.execute_command": "執行命令",
"jvm_diagnostic.workbench.action.probe": "檢查能力",
@@ -5873,123 +5990,6 @@
"jvm_resource.section.resource_value": "資源值",
"jvm_resource.section.supported_actions": "資源支援動作",
"jvm_resource.title": "JVM 資源工作台",
- "jvm.backend.capability.reason.read_only": "目前連線為唯讀",
- "jvm.backend.connection_error.agent.base_url_invalid.help": "請填寫完整的 `http://` 或 `https://` 位址,例如 `http://127.0.0.1:19090/gonavi/agent/jvm`。",
- "jvm.backend.connection_error.agent.base_url_invalid.summary": "Agent 連線失敗:Agent Base URL 格式不合法。",
- "jvm.backend.connection_error.agent.base_url_required": "Agent 連線失敗:未填寫 Agent Base URL。",
- "jvm.backend.connection_error.agent.connection_refused.help": "請確認 Java 服務已透過 `-javaagent` 啟動 GoNavi Agent,並檢查 Base URL、連接埠對映與防火牆。",
- "jvm.backend.connection_error.agent.connection_refused.summary": "Agent 連線失敗:目標 Agent 管理連接埠未監聽,或目前位址無法連線。",
- "jvm.backend.connection_error.agent.forbidden.help": "請確認目前用戶端來源、鑑權設定和 Agent 存取策略允許 GoNavi 存取。",
- "jvm.backend.connection_error.agent.forbidden.summary": "Agent 連線失敗:目前請求被 Agent 拒絕。",
- "jvm.backend.connection_error.agent.scheme_unsupported.help": "請將 Agent Base URL 改成以 `http://` 或 `https://` 開頭的位址。",
- "jvm.backend.connection_error.agent.scheme_unsupported.summary": "Agent 連線失敗:目前只支援 HTTP 或 HTTPS 協定。",
- "jvm.backend.connection_error.agent.timeout.help": "請確認目標位址可連線、Agent 已完成啟動,並視需要增加連線逾時時間。",
- "jvm.backend.connection_error.agent.timeout.summary": "Agent 連線失敗:存取 Agent 管理連接埠逾時。",
- "jvm.backend.connection_error.agent.unauthorized.help": "請檢查連線中的 Agent API Key 是否與目標服務啟動參數一致。",
- "jvm.backend.connection_error.agent.unauthorized.summary": "Agent 連線失敗:Agent 已回應,但目前 API Key 無效或缺失。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.help": "請填寫完整的 `http://` 或 `https://` 位址,並指向實作 GoNavi JVM HTTP 合約的管理介面根路徑,例如 `http://127.0.0.1:19090/manage/jvm`。",
- "jvm.backend.connection_error.endpoint.base_url_invalid.summary": "Endpoint 連線失敗:Endpoint Base URL 格式不合法。",
- "jvm.backend.connection_error.endpoint.base_url_required": "Endpoint 連線失敗:未填寫 Endpoint Base URL。",
- "jvm.backend.connection_error.endpoint.connection_refused.help": "請確認 Base URL 指向實作 GoNavi JVM HTTP 合約的管理介面,並檢查服務監聽、連接埠對映與防火牆。",
- "jvm.backend.connection_error.endpoint.connection_refused.summary": "Endpoint 連線失敗:目標管理介面未監聽,或目前位址無法連線。",
- "jvm.backend.connection_error.endpoint.forbidden.help": "請確認目前用戶端來源、鑑權設定和存取策略允許 GoNavi 存取該管理介面。",
- "jvm.backend.connection_error.endpoint.forbidden.summary": "Endpoint 連線失敗:目前請求被目標管理介面拒絕。",
- "jvm.backend.connection_error.endpoint.not_found.help": "請確認 Base URL 指向 JVM 管理介面根路徑,而不是一般業務介面、健康檢查位址或閘道首頁。",
- "jvm.backend.connection_error.endpoint.not_found.summary": "Endpoint 連線失敗:目標位址已回應,但找不到 GoNavi JVM 管理介面。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.help": "請將 Endpoint Base URL 改成以 `http://` 或 `https://` 開頭的位址。",
- "jvm.backend.connection_error.endpoint.scheme_unsupported.summary": "Endpoint 連線失敗:目前只支援 HTTP 或 HTTPS 協定。",
- "jvm.backend.connection_error.endpoint.timeout.help": "請確認 Base URL 可連線、目標服務已完成啟動,並視需要增加連線逾時時間。",
- "jvm.backend.connection_error.endpoint.timeout.summary": "Endpoint 連線失敗:存取目標管理介面逾時。",
- "jvm.backend.connection_error.endpoint.unauthorized.help": "請檢查連線中的 Endpoint API Key 是否與目標服務設定一致。",
- "jvm.backend.connection_error.endpoint.unauthorized.summary": "Endpoint 連線失敗:目標管理介面已回應,但目前 API Key 無效或缺失。",
- "jvm.backend.connection_error.generic": "JVM 連線失敗",
- "jvm.backend.connection_error.jmx.auth.help": "請確認目標 JMX 是否關閉認證;如果必須認證,需要補充使用者名稱/密碼後再連線。",
- "jvm.backend.connection_error.jmx.auth.summary": "JMX 連線失敗:{{target}} 需要認證,或目前憑證不可用。",
- "jvm.backend.connection_error.jmx.connection_refused.help": "請確認目標 JVM 已開啟遠端 JMX,並檢查主機、防火牆、連接埠對映和 SSH/代理設定。",
- "jvm.backend.connection_error.jmx.connection_refused.summary": "JMX 連線失敗:無法連線到 {{target}},對應連接埠沒有監聽或目前網路無法連線。",
- "jvm.backend.connection_error.jmx.connection_reset.help": "請確認填寫的是 JVM 真正對外暴露的 JMX 連接埠,而不是業務連接埠、除錯連接埠或被代理轉發的連接埠。",
- "jvm.backend.connection_error.jmx.connection_reset.summary": "JMX 連線失敗:{{target}} 上的服務主動中斷連線,目前連接埠不是相容的標準 JMX RMI 連接埠。",
- "jvm.backend.connection_error.jmx.host_required": "JMX 連線失敗:未填寫主機位址。",
- "jvm.backend.connection_error.jmx.java_missing.help": "請先安裝 JRE/JDK,或透過環境變數 `GONAVI_JMX_JAVA_BIN` 指向正確的 `java` 可執行檔。",
- "jvm.backend.connection_error.jmx.java_missing.summary": "JMX 連線失敗:目前機器未找到 `java` runtime,GoNavi 無法啟動 JMX helper。",
- "jvm.backend.connection_error.jmx.no_such_object.help": "這通常代表填到了 RMI 註冊連接埠、除錯連接埠或其他 Java 服務連接埠。請檢查 `jmxremote.port` 和 `jmxremote.rmi.port` 設定是否正確。",
- "jvm.backend.connection_error.jmx.no_such_object.summary": "JMX 連線失敗:{{target}} 上雖然有 RMI 服務,但不是可用的 JMX RMIServer 連接埠。",
- "jvm.backend.connection_error.jmx.non_jrmp.help": "請改填應用實際暴露的 JMX 連接埠,而不是業務 `server.port`。如果服務只開啟 `-Dcom.sun.management.jmxremote`,但沒有設定 `jmxremote.port`,也無法直接遠端連線。",
- "jvm.backend.connection_error.jmx.non_jrmp.summary": "JMX 連線失敗:{{target}} 不是標準 JMX 遠端管理連接埠,目前更像一般業務連接埠或 HTTP 連接埠。",
- "jvm.backend.connection_error.jmx.port_invalid": "JMX 連線失敗:連接埠無效,請填寫 1-65535 之間的有效連接埠。",
- "jvm.backend.connection_error.jmx.timeout.help": "請確認連接埠可連線、網路未被攔截,並視需要增加連線逾時時間。",
- "jvm.backend.connection_error.jmx.timeout.summary": "JMX 連線失敗:連線 {{target}} 逾時。",
- "jvm.backend.connection_error.suggestion": "建議:{{detail}}",
- "jvm.backend.connection_error.technical_detail": "技術細節:{{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_invalid": "Arthas Tunnel 位址格式不正確:{{detail}}",
- "jvm.backend.diagnostic.arthas.base_url_required": "Arthas Tunnel 位址不能為空",
- "jvm.backend.diagnostic.arthas.cancel_command_mismatch": "目前 Arthas Tunnel 會話的活動命令與待取消命令不一致",
- "jvm.backend.diagnostic.arthas.command_already_running": "目前 Arthas Tunnel 會話已有命令在執行,請先等待完成或取消",
- "jvm.backend.diagnostic.arthas.command_canceled": "Arthas Tunnel 命令已終止",
- "jvm.backend.diagnostic.arthas.command_timeout": "Arthas Tunnel 命令執行逾時,{{timeout}} 內未完成",
- "jvm.backend.diagnostic.arthas.connect_canceled": "建立 Arthas Tunnel WebSocket 連線已終止",
- "jvm.backend.diagnostic.arthas.connect_failed": "建立 Arthas Tunnel WebSocket 連線失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.connect_timeout": "建立 Arthas Tunnel WebSocket 連線逾時,{{timeout}} 內未收到回應",
- "jvm.backend.diagnostic.arthas.connection_closed": "Arthas Tunnel 連線已關閉:{{detail}}",
- "jvm.backend.diagnostic.arthas.connection_closed_code": "Arthas Tunnel 連線已關閉:code={{code}}",
- "jvm.backend.diagnostic.arthas.connection_not_ready": "Arthas Tunnel 連線尚未建立完成,請稍後重試",
- "jvm.backend.diagnostic.arthas.http_failed": "Arthas Tunnel 連線失敗:HTTP {{status}}",
- "jvm.backend.diagnostic.arthas.no_running_command": "目前 Arthas Tunnel 會話沒有正在執行的命令",
- "jvm.backend.diagnostic.arthas.read_canceled": "讀取 Arthas Tunnel 輸出已終止",
- "jvm.backend.diagnostic.arthas.read_deadline_failed": "Arthas Tunnel 讀取逾時設定失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.read_failed": "讀取 Arthas Tunnel 輸出失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.read_timeout": "讀取 Arthas Tunnel 輸出逾時,{{timeout}} 內未收到回應",
- "jvm.backend.diagnostic.arthas.request_encode_failed": "Arthas Tunnel 請求編碼失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.scheme_unsupported": "Arthas Tunnel 僅支援 http/https/ws/wss 位址:{{scheme}}",
- "jvm.backend.diagnostic.arthas.send_canceled": "向 Arthas Tunnel 傳送終端指令已終止",
- "jvm.backend.diagnostic.arthas.send_failed": "向 Arthas Tunnel 傳送終端指令失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.send_timeout": "向 Arthas Tunnel 傳送終端指令逾時,{{timeout}} 內未收到回應",
- "jvm.backend.diagnostic.arthas.session_config_changed": "Arthas Tunnel 會話設定已變更,請重新建立診斷會話",
- "jvm.backend.diagnostic.arthas.session_missing": "診斷會話不存在,請重新建立 Arthas Tunnel 會話",
- "jvm.backend.diagnostic.arthas.target_id_required": "Arthas Tunnel 需要填寫目標實例標識(targetId / agentId)",
- "jvm.backend.diagnostic.arthas.target_not_found": "找不到目標實例,請確認 targetId / agentId 是否填寫正確,且對應 tunnel client 已上線",
- "jvm.backend.diagnostic.arthas.target_not_found_with_id": "找不到目標實例 {{target}},請確認 targetId / agentId 是否填寫正確,且對應 tunnel client 已上線",
- "jvm.backend.diagnostic.arthas.terminal_command_encode_failed": "Arthas Tunnel 終端指令編碼失敗:{{detail}}",
- "jvm.backend.diagnostic.arthas.write_deadline_failed": "Arthas Tunnel 寫入逾時設定失敗:{{detail}}",
- "jvm.backend.diagnostic.error.audit_write_blocked": "診斷稽核記錄寫入失敗,已阻止命令執行: {{detail}}",
- "jvm.backend.diagnostic.error.cancel_identifiers_required": "取消命令缺少 sessionId 或 commandId",
- "jvm.backend.diagnostic.error.command_required": "診斷命令不能為空",
- "jvm.backend.diagnostic.error.disabled": "目前連線未啟用 JVM 診斷增強模式",
- "jvm.backend.diagnostic.error.execute_canceled": "診斷執行請求已終止:{{detail}}",
- "jvm.backend.diagnostic.error.session_id_required": "診斷會話 ID 不能為空,請先建立會話",
- "jvm.backend.diagnostic.error.transport_unsupported": "不支援的 JVM 診斷傳輸模式:{{transport}}",
- "jvm.backend.diagnostic.message.arthas_command_canceled": "Arthas 命令已終止",
- "jvm.backend.diagnostic.message.arthas_command_completed": "Arthas 命令執行完成",
- "jvm.backend.diagnostic.message.cancel_requested": "已傳送取消請求,等待診斷橋接端結束命令",
- "jvm.backend.diagnostic.message.command_completed": "診斷命令執行完成",
- "jvm.backend.diagnostic.policy.multiline_not_supported": "診斷命令不支援換行或多命令輸入",
- "jvm.backend.diagnostic.policy.mutating_not_allowed": "目前連線未開放高風險診斷命令:{{command}}",
- "jvm.backend.diagnostic.policy.observe_not_allowed": "目前連線未開放觀察類診斷命令:{{command}}",
- "jvm.backend.diagnostic.policy.read_only_observe_only": "目前連線為唯讀模式,僅允許觀察類診斷命令",
- "jvm.backend.diagnostic.policy.trace_not_allowed": "目前連線未開放追蹤類診斷命令:{{command}}",
- "jvm.backend.diagnostic.warning.audit_write_failed": "稽核記錄寫入失敗: {{detail}}",
- "jvm.backend.error.audit_write_blocked": "稽核記錄寫入失敗,已阻止 JVM 變更: {{detail}}",
- "jvm.backend.error.change_action_required": "JVM 變更操作不能為空",
- "jvm.backend.error.change_blocked_by_guard": "目前變更已被 Guard 攔截",
- "jvm.backend.error.change_blocked_read_only": "目前連線為唯讀,禁止寫入",
- "jvm.backend.error.change_confirmation_token_failed": "產生 JVM 變更確認權杖失敗: {{detail}}",
- "jvm.backend.error.change_reason_required": "JVM 變更原因不能為空",
- "jvm.backend.error.change_resource_id_required": "JVM 資源 ID 不能為空",
- "jvm.backend.error.confirmation_token_expired": "確認權杖已過期,請重新預覽並確認",
- "jvm.backend.error.confirmation_token_invalid": "確認權杖無效,請重新預覽並確認",
- "jvm.backend.error.confirmation_token_missing": "缺少確認權杖,請先完成預覽確認",
- "jvm.backend.error.disallowed_mode": "目前連線不允許使用 {{mode}} 模式",
- "jvm.backend.error.preview_confirmation_missing": "預覽確認權杖缺失,請重新預覽後再提交",
- "jvm.backend.error.preview_context_hash_failed": "產生 JVM 預覽上下文失敗: {{detail}}",
- "jvm.backend.error.preview_payload_hash_failed": "產生 JVM 預覽 Payload 摘要失敗: {{detail}}",
- "jvm.backend.error.resource_path_invalid": "JVM 資源路徑無效: {{detail}}",
- "jvm.backend.message.connect_success": "JVM 連線成功",
- "jvm.backend.monitoring.error.session_not_found": "找不到 {{connectionId}} {{providerMode}} 的 JVM 監控會話",
- "jvm.backend.monitoring.error.snapshot_unsupported": "{{provider}} 監控快照暫未支援",
- "jvm.backend.monitoring.warning.sample_auto_stopped": "監控採樣連續失敗 {{count}} 次,已自動停止本次監控會話",
- "jvm.backend.separator.message_warning": ";",
- "jvm.backend.warning.failed_audit_write_failed": "失敗稽核寫入失敗: {{detail}}",
- "jvm.backend.warning.terminal_audit_write_failed": "終態稽核寫入失敗: {{detail}}",
"log_panel.action.clear": "清空記錄",
"log_panel.action.close": "關閉面板",
"log_panel.affected_rows": "影響列數:{{count}}",
@@ -6001,37 +6001,6 @@
"log_panel.empty": "暫無 SQL 執行記錄",
"log_panel.short_title": "日誌",
"log_panel.title": "SQL 執行記錄",
- "message_publish_modal.action.send": "傳送",
- "message_publish_modal.error.build_command_failed": "建構傳送命令失敗",
- "message_publish_modal.error.send_failed_detail": "傳送失敗:{{detail}}",
- "message_publish_modal.error.unknown_error": "未知錯誤",
- "message_publish_modal.field.body_mode.label": "訊息體類型",
- "message_publish_modal.field.body.extra": "JSON 模式下需輸入合法 JSON;文字模式會按原樣傳送。",
- "message_publish_modal.field.body.label": "訊息體",
- "message_publish_modal.field.body.placeholder": "請輸入訊息體",
- "message_publish_modal.field.body.required": "請輸入訊息體",
- "message_publish_modal.field.delay_level.extra": "RocketMQ 使用固定延時級別,0 表示立即傳送。",
- "message_publish_modal.field.delay_level.label": "Delay Level(可選)",
- "message_publish_modal.field.exchange.extra": "留空會使用預設交換機;若填寫自訂交換機,請確認目標 Queue 已建立 binding。",
- "message_publish_modal.field.exchange.label": "Exchange(可選)",
- "message_publish_modal.field.exchange.placeholder": "例如:events.topic",
- "message_publish_modal.field.headers.extra": "需為 JSON 物件,例如 {{example}}。",
- "message_publish_modal.field.headers.label": "Headers(可選)",
- "message_publish_modal.field.properties.extra": "需為 JSON 物件,例如 {{example}}。",
- "message_publish_modal.field.properties.label": "Properties(可選)",
- "message_publish_modal.field.qos.extra": "0 為 at most once,1 為 at least once,2 為 exactly once。",
- "message_publish_modal.field.retain.label": "Retain 訊息",
- "message_publish_modal.field.routing_key.extra": "留空時預設使用目前 Queue 名稱。",
- "message_publish_modal.field.routing_key.label": "Routing Key(可選)",
- "message_publish_modal.field.routing_key.placeholder": "例如:orders.queue",
- "message_publish_modal.field.tag.extra": "留空表示不篩選或不寫入 Tag。",
- "message_publish_modal.field.tag.label": "Tag(可選)",
- "message_publish_modal.footer.success_prefix": "傳送成功後會返回",
- "message_publish_modal.footer.success_suffix": ",用於確認本次測試訊息是否已提交。",
- "message_publish_modal.option.no_delay": "不延時",
- "message_publish_modal.option.text": "文字",
- "message_publish_modal.title": "測試傳送訊息",
- "message_publish_modal.title_with_connection": "測試傳送訊息 · {{connectionName}}",
"message_publish.error.destination_required": "請輸入目標 Topic / Queue",
"message_publish.error.invalid_json_detail": "{{field}}不是合法 JSON:{{detail}}",
"message_publish.error.json_object_required": "{{field}} 必須是 JSON 物件",
@@ -6059,6 +6028,37 @@
"message_publish.presentation.rocketmq.success_hint": "Tag、Keys、Delay Level 與 Properties 會一併寫入 RocketMQ 訊息屬性。",
"message_publish.presentation.rocketmq.tag_placeholder": "例如:TagA",
"message_publish.presentation.topic_required": "請輸入 Topic",
+ "message_publish_modal.action.send": "傳送",
+ "message_publish_modal.error.build_command_failed": "建構傳送命令失敗",
+ "message_publish_modal.error.send_failed_detail": "傳送失敗:{{detail}}",
+ "message_publish_modal.error.unknown_error": "未知錯誤",
+ "message_publish_modal.field.body.extra": "JSON 模式下需輸入合法 JSON;文字模式會按原樣傳送。",
+ "message_publish_modal.field.body.label": "訊息體",
+ "message_publish_modal.field.body.placeholder": "請輸入訊息體",
+ "message_publish_modal.field.body.required": "請輸入訊息體",
+ "message_publish_modal.field.body_mode.label": "訊息體類型",
+ "message_publish_modal.field.delay_level.extra": "RocketMQ 使用固定延時級別,0 表示立即傳送。",
+ "message_publish_modal.field.delay_level.label": "Delay Level(可選)",
+ "message_publish_modal.field.exchange.extra": "留空會使用預設交換機;若填寫自訂交換機,請確認目標 Queue 已建立 binding。",
+ "message_publish_modal.field.exchange.label": "Exchange(可選)",
+ "message_publish_modal.field.exchange.placeholder": "例如:events.topic",
+ "message_publish_modal.field.headers.extra": "需為 JSON 物件,例如 {{example}}。",
+ "message_publish_modal.field.headers.label": "Headers(可選)",
+ "message_publish_modal.field.properties.extra": "需為 JSON 物件,例如 {{example}}。",
+ "message_publish_modal.field.properties.label": "Properties(可選)",
+ "message_publish_modal.field.qos.extra": "0 為 at most once,1 為 at least once,2 為 exactly once。",
+ "message_publish_modal.field.retain.label": "Retain 訊息",
+ "message_publish_modal.field.routing_key.extra": "留空時預設使用目前 Queue 名稱。",
+ "message_publish_modal.field.routing_key.label": "Routing Key(可選)",
+ "message_publish_modal.field.routing_key.placeholder": "例如:orders.queue",
+ "message_publish_modal.field.tag.extra": "留空表示不篩選或不寫入 Tag。",
+ "message_publish_modal.field.tag.label": "Tag(可選)",
+ "message_publish_modal.footer.success_prefix": "傳送成功後會返回",
+ "message_publish_modal.footer.success_suffix": ",用於確認本次測試訊息是否已提交。",
+ "message_publish_modal.option.no_delay": "不延時",
+ "message_publish_modal.option.text": "文字",
+ "message_publish_modal.title": "測試傳送訊息",
+ "message_publish_modal.title_with_connection": "測試傳送訊息 · {{connectionName}}",
"proxy.backend.error.host_empty": "代理主機不可為空",
"proxy.backend.error.http_connect_failed": "連線至 HTTP 代理失敗:{{detail}}",
"proxy.backend.error.http_connect_read_failed": "讀取 HTTP CONNECT 回應失敗:{{detail}}",
@@ -6070,6 +6070,11 @@
"proxy.backend.error.socks5_connect_failed": "SOCKS5 代理連線失敗:{{detail}}",
"proxy.backend.error.socks5_dialer_failed": "建立 SOCKS5 代理撥號器失敗:{{detail}}",
"proxy.backend.error.unsupported_type": "不支援的代理類型:{{type}}",
+ "query.format": "格式化 SQL",
+ "query.new": "新增查詢",
+ "query.run": "執行",
+ "query.save": "儲存查詢",
+ "query.stop": "停止",
"query_editor.action.ai_explain_sql": "AI 解釋 SQL",
"query_editor.action.ai_explain_sql_menu": "解釋 SQL",
"query_editor.action.ai_generate_sql": "AI 產生 SQL",
@@ -6079,9 +6084,9 @@
"query_editor.action.ai_schema_analysis": "結構描述分析",
"query_editor.action.ai_text_to_sql_menu": "Text-to-SQL",
"query_editor.action.export_sql_file": "匯出 SQL 檔案",
- "query_editor.action.format": "格式化",
"query_editor.action.find_in_editor": "搜尋",
"query_editor.action.find_in_editor_with_shortcut": "編輯器內搜尋({{shortcut}})",
+ "query_editor.action.format": "格式化",
"query_editor.action.format_sql": "格式化 SQL",
"query_editor.action.format_sql_with_shortcut": "格式化 SQL({{shortcut}})",
"query_editor.action.hide_results_panel": "隱藏結果區",
@@ -6286,12 +6291,16 @@
"query_editor.max_rows.option_5000": "最大列數:5000",
"query_editor.max_rows.option_unlimited": "最大列數:不限",
"query_editor.max_rows.tooltip": "最大傳回列數。SELECT 陳述式會自動加上 LIMIT,避免過大的結果集造成介面停滯。",
+ "query_editor.message.ai_model_missing": "目前 AI Provider 尚未選擇模型,請先在 AI 設定中選擇模型。",
+ "query_editor.message.ai_provider_missing": "請先在 AI 設定中設定並啟用 AI Provider。",
+ "query_editor.message.ai_service_unavailable": "AI 服務尚未就緒,請稍後重試或檢查 AI 設定。",
"query_editor.message.append_success": "已附加程式碼。",
"query_editor.message.cancel_failed": "取消查詢失敗:{{error}}",
"query_editor.message.cancel_no_running": "沒有正在執行的查詢可取消。",
"query_editor.message.cancel_success": "查詢已終止。",
"query_editor.message.connection_not_found": "找不到連線。",
"query_editor.message.connection_readonly_blocked": "目前連線已啟用正式保護,僅允許執行查詢操作。",
+ "query_editor.message.current_line_no_copyable_content": "目前行沒有可複製內容。",
"query_editor.message.execution_failed_with_error": "查詢執行失敗:{{error}}",
"query_editor.message.execution_multi_success": "已執行 {{statements}} 個陳述式,並產生 {{results}} 個結果集。",
"query_editor.message.execution_result_sets_success": "執行完成,並產生 {{results}} 個結果集。",
@@ -6301,12 +6310,8 @@
"query_editor.message.format_failed": "格式化失敗:SQL 語法可能無效。",
"query_editor.message.format_restore_success": "已還原到美化前 SQL",
"query_editor.message.insert_success": "程式碼已插入目前游標位置。",
- "query_editor.message.ai_model_missing": "目前 AI Provider 尚未選擇模型,請先在 AI 設定中選擇模型。",
- "query_editor.message.ai_provider_missing": "請先在 AI 設定中設定並啟用 AI Provider。",
- "query_editor.message.ai_service_unavailable": "AI 服務尚未就緒,請稍後重試或檢查 AI 設定。",
"query_editor.message.no_executable_sql": "沒有可執行的 SQL。",
"query_editor.message.no_format_restore_snapshot": "沒有可還原的美化前 SQL",
- "query_editor.message.current_line_no_copyable_content": "目前行沒有可複製內容。",
"query_editor.message.no_selectable_sql": "沒有可選取的 SQL 陳述式。",
"query_editor.message.object_info_target_not_found": "目前游標未定位到可識別的資料表或欄位。",
"query_editor.message.page_query_empty": "翻頁未傳回結果集",
@@ -6351,10 +6356,15 @@
"query_editor.result.tab_title_success": "結果 {{index}} ✓",
"query_editor.results_panel.action.hide": "隱藏",
"query_editor.results_panel.aria.hide": "隱藏結果區",
+ "query_editor.results_panel.detached.close": "關閉視窗",
+ "query_editor.results_panel.detached.restore": "還原為結果標籤",
+ "query_editor.results_panel.detached.title": "結果 {{index}}",
"query_editor.results_panel.menu.close_all": "關閉所有",
"query_editor.results_panel.menu.close_left": "關閉左側",
"query_editor.results_panel.menu.close_other": "關閉其他頁",
"query_editor.results_panel.menu.close_right": "關閉右側",
+ "query_editor.results_panel.menu.open_in_window": "在獨立視窗開啟",
+ "query_editor.results_panel.menu.restore_to_tab": "還原為結果標籤",
"query_editor.results_panel.message.action.copy": "複製",
"query_editor.results_panel.message.copy_failed": "複製訊息失敗:{{detail}}",
"query_editor.results_panel.message.copy_unsupported": "目前環境不支援複製到剪貼簿",
@@ -6371,12 +6381,6 @@
"query_editor.save_modal.rename_title": "重新命名查詢",
"query_editor.save_modal.title": "儲存查詢",
"query_editor.save_modal.unnamed": "未命名查詢",
- "query_editor.snippet_picker.description": "選擇既有的 SQL 片段並插入到目前游標位置。",
- "query_editor.snippet_picker.empty": "目前還沒有可用的 SQL 片段,可前往片段管理新增或恢復預設片段。",
- "query_editor.snippet_picker.empty_filtered": "找不到符合條件的 SQL 片段。",
- "query_editor.snippet_picker.manage": "管理片段",
- "query_editor.snippet_picker.search_placeholder": "搜尋前綴、名稱或內容",
- "query_editor.snippet_picker.title": "插入 SQL 片段",
"query_editor.slash_command.diff.description": "比較資料表差異並產生變更",
"query_editor.slash_command.diff.label": "資料表比較",
"query_editor.slash_command.diff.prompt": "請比較這兩個資料表結構,並產生從舊版本遷移到新版本的 ALTER 陳述式。",
@@ -6401,13 +6405,12 @@
"query_editor.slash_command.sql.description": "描述需求並產生陳述式",
"query_editor.slash_command.sql.label": "產生 SQL",
"query_editor.slash_command.sql.prompt": "請根據以下需求產生 SQL:",
- "query_editor.text_to_sql.description": "描述你想查詢或處理的資料,GoNavi 會結合目前連線、資料庫和已載入表結構產生 SQL。",
- "query_editor.text_to_sql.generate": "產生 SQL",
- "query_editor.text_to_sql.mode.insert": "插入到游標",
- "query_editor.text_to_sql.mode.replace_all": "取代全文",
- "query_editor.text_to_sql.mode.replace_selection": "取代選取範圍",
- "query_editor.text_to_sql.placeholder": "例如:統計最近 30 天每天的訂單金額,並按日期升冪返回",
- "query_editor.text_to_sql.title": "Text-to-SQL",
+ "query_editor.snippet_picker.description": "選擇既有的 SQL 片段並插入到目前游標位置。",
+ "query_editor.snippet_picker.empty": "目前還沒有可用的 SQL 片段,可前往片段管理新增或恢復預設片段。",
+ "query_editor.snippet_picker.empty_filtered": "找不到符合條件的 SQL 片段。",
+ "query_editor.snippet_picker.manage": "管理片段",
+ "query_editor.snippet_picker.search_placeholder": "搜尋前綴、名稱或內容",
+ "query_editor.snippet_picker.title": "插入 SQL 片段",
"query_editor.sql_error.rule.column_missing.explanation": "SQL 引用了結果集中不存在、拼寫不一致或目前表沒有的欄位。",
"query_editor.sql_error.rule.column_missing.label": "欄位不存在",
"query_editor.sql_error.rule.column_missing.suggestion": "檢查欄位名、別名、大小寫、引用表別名,以及欄位是否屬於目前 FROM/JOIN 的物件。",
@@ -6442,6 +6445,13 @@
"query_editor.sql_error.wrapper.raw_line": "原始錯誤:{{error}}",
"query_editor.sql_error.wrapper.semantic_line": "中文語義:{{label}}。{{explanation}}",
"query_editor.sql_error.wrapper.suggestion_line": "處理建議:{{suggestion}}",
+ "query_editor.text_to_sql.description": "描述你想查詢或處理的資料,GoNavi 會結合目前連線、資料庫和已載入表結構產生 SQL。",
+ "query_editor.text_to_sql.generate": "產生 SQL",
+ "query_editor.text_to_sql.mode.insert": "插入到游標",
+ "query_editor.text_to_sql.mode.replace_all": "取代全文",
+ "query_editor.text_to_sql.mode.replace_selection": "取代選取範圍",
+ "query_editor.text_to_sql.placeholder": "例如:統計最近 30 天每天的訂單金額,並按日期升冪返回",
+ "query_editor.text_to_sql.title": "Text-to-SQL",
"query_editor.transaction.action.commit": "提交",
"query_editor.transaction.action.commit_with_count": "提交 ({{count}})",
"query_editor.transaction.action.rollback": "回滾",
@@ -6457,11 +6467,43 @@
"query_history.backend.error.connection_fingerprint_invalid": "無法解析連線指紋",
"query_history.backend.message.cleared": "已清空慢查詢歷史",
"query_history.backend.message.loaded": "載入完成",
- "query.format": "格式化 SQL",
- "query.new": "新增查詢",
- "query.run": "執行",
- "query.save": "儲存查詢",
- "query.stop": "停止",
+ "redis.backend.error.address_required": "Redis 連線地址不能為空",
+ "redis.backend.error.argument_invalid_type": "{{name}} 類型無效",
+ "redis.backend.error.argument_required": "{{name}} 不能為空",
+ "redis.backend.error.cluster_connect_failed": "Redis 叢集連線失敗:{{detail}}",
+ "redis.backend.error.command_required": "命令不能為空",
+ "redis.backend.error.connect_attempt_failed": "第 {{attempt}} 次連線失敗:{{detail}}",
+ "redis.backend.error.connect_failed": "Redis 連線失敗:{{detail}}",
+ "redis.backend.error.connect_tls_setup_failed": "第 {{attempt}} 次 TLS 設定失敗:{{detail}}",
+ "redis.backend.error.export_no_keys": "沒有可匯出的 Key",
+ "redis.backend.error.import_no_keys_selected": "未選擇要匯入的 Key",
+ "redis.backend.error.import_payload_invalid": "Redis 匯入檔案無效:{{detail}}",
+ "redis.backend.error.invalid_node_address": "無效 Redis 節點地址:{{address}}",
+ "redis.backend.error.invalid_port": "無效 Redis 連接埠:{{address}}",
+ "redis.backend.error.node_address_required": "Redis 節點地址不能為空",
+ "redis.backend.error.select_db_index_invalid": "無效資料庫索引:{{value}}",
+ "redis.backend.error.select_db_index_out_of_range": "資料庫索引必須在 {{min}}-{{max}} 之間",
+ "redis.backend.error.select_db_index_required": "SELECT 命令需要提供資料庫索引",
+ "redis.backend.error.sentinel_connect_failed": "Redis Sentinel 連線失敗:{{detail}}",
+ "redis.backend.error.sentinel_master_required": "Redis Sentinel 模式需要填寫 master 名稱",
+ "redis.backend.error.ssh_tunnel_create_failed": "建立 SSH 通道失敗:{{detail}}",
+ "redis.backend.error.test_connection_close_failed": "連線成功,但釋放測試連線失敗:{{detail}}",
+ "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}}模式暫不支援 SSH 通道,請關閉 SSH 後重試",
+ "redis.backend.label.topology_cluster": "叢集",
+ "redis.backend.label.topology_multi_node": "多節點",
+ "redis.backend.label.topology_sentinel": "Sentinel",
+ "redis.backend.message.add_success": "新增成功",
+ "redis.backend.message.connect_success": "連線成功",
+ "redis.backend.message.delete_success": "刪除成功",
+ "redis.backend.message.export_success": "匯出成功",
+ "redis.backend.message.flush_success": "清空成功",
+ "redis.backend.message.import_success": "匯入成功",
+ "redis.backend.message.rename_success": "重新命名成功",
+ "redis.backend.message.select_db_success": "切換成功",
+ "redis.backend.message.set_success": "設定成功",
+ "redis.db_alias.menu.set": "設定別名",
+ "redis.db_alias.modal.placeholder": "例如:快取、工作階段(留空則清除)",
+ "redis.db_alias.modal.title": "{{db}} 的別名",
"redis_command.action.clear_console": "清空控制台",
"redis_command.action.execute": "執行(Cmd+Enter)",
"redis_command.completion.detail": "Redis 命令",
@@ -6500,6 +6542,7 @@
"redis_viewer.action.add_list_tail": "推入尾部",
"redis_viewer.action.add_member": "新增成員",
"redis_viewer.action.add_stream_entry": "新增項目",
+ "redis_viewer.action.change_import_file": "更換匯入檔案",
"redis_viewer.action.clear_group_selection": "清除選取",
"redis_viewer.action.clear_selection": "清除選取",
"redis_viewer.action.copy": "複製",
@@ -6510,7 +6553,6 @@
"redis_viewer.action.edit": "編輯",
"redis_viewer.action.export_all": "匯出全部",
"redis_viewer.action.export_selected": "匯出已選",
- "redis_viewer.action.change_import_file": "更換匯入檔案",
"redis_viewer.action.import": "匯入",
"redis_viewer.action.load_all": "載入全部",
"redis_viewer.action.load_more": "載入更多",
@@ -6518,9 +6560,9 @@
"redis_viewer.action.refresh": "重新整理",
"redis_viewer.action.rename_key": "重新命名 Key",
"redis_viewer.action.select_all_import_keys": "全選匯入項目",
- "redis_viewer.action.select_import_file": "選擇匯入檔案",
"redis_viewer.action.select_all_loaded": "全選已載入",
"redis_viewer.action.select_group": "選取",
+ "redis_viewer.action.select_import_file": "選擇匯入檔案",
"redis_viewer.action.set_ttl": "設定 TTL",
"redis_viewer.aria.collapse_group": "收合群組",
"redis_viewer.aria.expand_group": "展開群組",
@@ -6546,11 +6588,11 @@
"redis_viewer.hint.binary_readonly": "二進位資料無法編輯",
"redis_viewer.hint.switch_auto_to_edit": "切換到 Auto 模式後即可編輯",
"redis_viewer.label.encoding": "編碼:{{encoding}}",
+ "redis_viewer.label.import_database": "來源庫:db{{database}}",
+ "redis_viewer.label.import_selection": "已選擇 {{selected}} / {{total}} 個 Key",
"redis_viewer.label.keys_count": "已載入 {{count}} 個 Key",
"redis_viewer.label.length": "長度:{{count}}",
"redis_viewer.label.node_count": "{{count}} 個節點",
- "redis_viewer.label.import_database": "來源庫:db{{database}}",
- "redis_viewer.label.import_selection": "已選擇 {{selected}} / {{total}} 個 Key",
"redis_viewer.label.original_key": "原 Key:{{key}}",
"redis_viewer.message.add_failed": "新增失敗:{{detail}}",
"redis_viewer.message.add_success": "已新增",
@@ -6602,9 +6644,9 @@
"redis_viewer.modal.rename_key": "重新命名 Key",
"redis_viewer.modal.set_ttl": "設定 TTL",
"redis_viewer.modal.update_score": "更新分數",
+ "redis_viewer.notice.large_keyspace_mode": "大型 Keyspace 效能模式已啟用。節點渲染已簡化,最多保留 {{count}} 個展開群組。",
"redis_viewer.option.import_overwrite": "覆蓋已存在 Key",
"redis_viewer.option.import_skip_existing": "略過已存在 Key",
- "redis_viewer.notice.large_keyspace_mode": "大型 Keyspace 效能模式已啟用。節點渲染已簡化,最多保留 {{count}} 個展開群組。",
"redis_viewer.placeholder.key_name": "Key 名稱",
"redis_viewer.placeholder.member_value": "輸入成員值",
"redis_viewer.placeholder.new_element_value": "輸入新元素值",
@@ -6651,43 +6693,6 @@
"redis_viewer.view.hex": "Hex",
"redis_viewer.view.text": "原始文字",
"redis_viewer.view.title": "檢視模式",
- "redis.backend.error.address_required": "Redis 連線地址不能為空",
- "redis.backend.error.argument_invalid_type": "{{name}} 類型無效",
- "redis.backend.error.argument_required": "{{name}} 不能為空",
- "redis.backend.error.cluster_connect_failed": "Redis 叢集連線失敗:{{detail}}",
- "redis.backend.error.command_required": "命令不能為空",
- "redis.backend.error.connect_attempt_failed": "第 {{attempt}} 次連線失敗:{{detail}}",
- "redis.backend.error.connect_failed": "Redis 連線失敗:{{detail}}",
- "redis.backend.error.connect_tls_setup_failed": "第 {{attempt}} 次 TLS 設定失敗:{{detail}}",
- "redis.backend.error.export_no_keys": "沒有可匯出的 Key",
- "redis.backend.error.import_no_keys_selected": "未選擇要匯入的 Key",
- "redis.backend.error.import_payload_invalid": "Redis 匯入檔案無效:{{detail}}",
- "redis.backend.error.invalid_node_address": "無效 Redis 節點地址:{{address}}",
- "redis.backend.error.invalid_port": "無效 Redis 連接埠:{{address}}",
- "redis.backend.error.node_address_required": "Redis 節點地址不能為空",
- "redis.backend.error.select_db_index_invalid": "無效資料庫索引:{{value}}",
- "redis.backend.error.select_db_index_out_of_range": "資料庫索引必須在 {{min}}-{{max}} 之間",
- "redis.backend.error.select_db_index_required": "SELECT 命令需要提供資料庫索引",
- "redis.backend.error.sentinel_connect_failed": "Redis Sentinel 連線失敗:{{detail}}",
- "redis.backend.error.sentinel_master_required": "Redis Sentinel 模式需要填寫 master 名稱",
- "redis.backend.error.ssh_tunnel_create_failed": "建立 SSH 通道失敗:{{detail}}",
- "redis.backend.error.test_connection_close_failed": "連線成功,但釋放測試連線失敗:{{detail}}",
- "redis.backend.error.topology_ssh_tunnel_unsupported": "Redis {{topology}}模式暫不支援 SSH 通道,請關閉 SSH 後重試",
- "redis.backend.label.topology_cluster": "叢集",
- "redis.backend.label.topology_multi_node": "多節點",
- "redis.backend.label.topology_sentinel": "Sentinel",
- "redis.backend.message.add_success": "新增成功",
- "redis.backend.message.connect_success": "連線成功",
- "redis.backend.message.delete_success": "刪除成功",
- "redis.backend.message.export_success": "匯出成功",
- "redis.backend.message.flush_success": "清空成功",
- "redis.backend.message.import_success": "匯入成功",
- "redis.backend.message.rename_success": "重新命名成功",
- "redis.backend.message.select_db_success": "切換成功",
- "redis.backend.message.set_success": "設定成功",
- "redis.db_alias.menu.set": "設定別名",
- "redis.db_alias.modal.placeholder": "例如:快取、工作階段(留空則清除)",
- "redis.db_alias.modal.title": "{{db}} 的別名",
"saved_query.default_name": "查詢-{{index}}",
"saved_query.error.missing_context": "儲存查詢缺少 SQL、連線或資料庫上下文",
"security_update.action.open_ai_settings": "AI 設定",
@@ -6810,14 +6815,14 @@
"sidebar.ai_prompt.query.intro": "請基於資料表 {{table}} 產生 3 條常用查詢 SQL。",
"sidebar.aria.switch_connection": "切換到連線 {{name}}",
"sidebar.badge.recommended": "推薦",
- "sidebar.batch_databases": "資料庫",
- "sidebar.batch_tables": "資料表",
"sidebar.batch.filtered_count": "已篩選 {{filtered}} / {{total}} 個物件",
"sidebar.batch.group.tables": "資料表",
"sidebar.batch.group.views": "檢視",
"sidebar.batch.no_matching_objects": "沒有符合的物件",
"sidebar.batch.selected_databases": "已選擇 {{selected}} / {{total}} 個資料庫",
"sidebar.batch.selected_objects": "已選擇 {{selected}} / {{total}} 個物件",
+ "sidebar.batch_databases": "資料庫",
+ "sidebar.batch_tables": "資料表",
"sidebar.command_search.action.ask_ai.title": "讓 AI 回答",
"sidebar.command_search.action.new_connection.meta": "建立資料庫、執行階段或其他資料來源連線",
"sidebar.command_search.action.new_connection.title": "新增資料來源",
@@ -6878,6 +6883,8 @@
"sidebar.copy_object_name.label.table": "資料表名稱",
"sidebar.copy_object_name.label.view": "檢視名稱",
"sidebar.error.unknown": "未知錯誤",
+ "sidebar.external_sql.directory_fallback": "SQL 目錄",
+ "sidebar.external_sql.root": "外部 SQL 檔案",
"sidebar.external_sql_modal.action.create": "新增",
"sidebar.external_sql_modal.action.rename": "重新命名",
"sidebar.external_sql_modal.field.directory_name": "目錄名稱",
@@ -6894,8 +6901,6 @@
"sidebar.external_sql_modal.validation.directory_name_required": "請輸入目錄名稱",
"sidebar.external_sql_modal.validation.sql_file_name_no_separator": "檔案名稱不能包含路徑分隔符",
"sidebar.external_sql_modal.validation.sql_file_name_required": "請輸入 SQL 檔案名稱",
- "sidebar.external_sql.directory_fallback": "SQL 目錄",
- "sidebar.external_sql.root": "外部 SQL 檔案",
"sidebar.field.database_name": "資料庫名稱",
"sidebar.field.new_database_name": "新資料庫名稱",
"sidebar.field.new_table_name": "新資料表名稱",
@@ -7116,8 +7121,8 @@
"sidebar.message.select_database_required": "請至少選擇一個資料庫。",
"sidebar.message.select_host_before_large_sql_file": "請先選擇 Host,再執行大型 SQL 檔案。",
"sidebar.message.select_object_required": "請至少選擇一個物件。",
- "sidebar.message.select_table_required": "請至少選擇一張資料表。",
"sidebar.message.select_sql_directory_failed": "選擇 SQL 目錄失敗:{{error}}",
+ "sidebar.message.select_table_required": "請至少選擇一張資料表。",
"sidebar.message.sidebar_filter_reset": "已重設側欄篩選。",
"sidebar.message.sidebar_filter_sync_disabled": "已關閉左側篩選同步。",
"sidebar.message.sidebar_filter_sync_enabled": "已開啟左側篩選同步。",
@@ -7157,10 +7162,7 @@
"sidebar.modal.batch_tables.title": "批次操作資料表",
"sidebar.modal.confirm_clear_selected_tables.content": "清除 {{connection}} / {{database}} 下已選物件的資料?此操作無法復原。",
"sidebar.modal.confirm_clear_selected_tables.title": "確認清除已選資料表",
- "sidebar.modal.confirm_delete_selected_databases.content": "刪除 {{connection}} 下 {{count}} 個已選資料庫?此操作無法復原。",
- "sidebar.modal.confirm_delete_selected_databases.title": "確認刪除已選資料庫",
- "sidebar.modal.confirm_delete_selected_tables.content": "刪除 {{connection}} / {{database}} 下 {{count}} 張已選資料表?此操作無法復原。",
- "sidebar.modal.confirm_delete_selected_tables.title": "確認刪除已選資料表",
+ "sidebar.modal.confirm_delete.title": "確認刪除",
"sidebar.modal.confirm_delete_connection.content": "刪除連線 {{name}}?",
"sidebar.modal.confirm_delete_database.content": "刪除 {{name}}?此操作無法復原。",
"sidebar.modal.confirm_delete_database.title": "刪除資料庫",
@@ -7169,6 +7171,10 @@
"sidebar.modal.confirm_delete_saved_query.content": "確定要刪除已儲存的查詢「{{name}}」嗎?此操作無法復原。",
"sidebar.modal.confirm_delete_schema.content": "刪除模式 {{name}}?該模式及其中所有物件都會被刪除,此操作無法復原。",
"sidebar.modal.confirm_delete_schema.title": "刪除模式",
+ "sidebar.modal.confirm_delete_selected_databases.content": "刪除 {{connection}} 下 {{count}} 個已選資料庫?此操作無法復原。",
+ "sidebar.modal.confirm_delete_selected_databases.title": "確認刪除已選資料庫",
+ "sidebar.modal.confirm_delete_selected_tables.content": "刪除 {{connection}} / {{database}} 下 {{count}} 張已選資料表?此操作無法復原。",
+ "sidebar.modal.confirm_delete_selected_tables.title": "確認刪除已選資料表",
"sidebar.modal.confirm_delete_sql_directory.content": "刪除 \"{{name}}\"?此操作會刪除本機磁碟目錄,且僅支援刪除空目錄。",
"sidebar.modal.confirm_delete_sql_directory.title": "刪除 SQL 目錄",
"sidebar.modal.confirm_delete_sql_file.content": "刪除 \"{{name}}\"?此操作會刪除本機磁碟檔案,無法復原。",
@@ -7178,7 +7184,6 @@
"sidebar.modal.confirm_delete_tag.content": "確定要刪除分組 \"{{name}}\" 嗎?這不會刪除其中的連線。",
"sidebar.modal.confirm_delete_view.content": "刪除 {{name}}?此操作無法復原。",
"sidebar.modal.confirm_delete_view.title": "刪除檢視",
- "sidebar.modal.confirm_delete.title": "確認刪除",
"sidebar.modal.confirm_table_data_action.content": "{{action}} {{table}}?此操作無法復原。",
"sidebar.modal.confirm_table_data_action.title": "確認 {{action}}",
"sidebar.modal.create_database.title": "建立資料庫",
@@ -7190,6 +7195,9 @@
"sidebar.modal.tag.create_title": "建立分組",
"sidebar.modal.tag.edit_description": "更新分組名稱和包含的連線。",
"sidebar.modal.tag.edit_title": "編輯分組",
+ "sidebar.object.function": "函式",
+ "sidebar.object.procedure": "預存程序",
+ "sidebar.object.view": "檢視",
"sidebar.object_group.events": "事件",
"sidebar.object_group.materialized_views": "物化檢視",
"sidebar.object_group.packages": "套件",
@@ -7198,9 +7206,6 @@
"sidebar.object_group.tables": "資料表",
"sidebar.object_group.triggers": "觸發器",
"sidebar.object_group.views": "檢視",
- "sidebar.object.function": "函式",
- "sidebar.object.procedure": "預存程序",
- "sidebar.object.view": "檢視",
"sidebar.placeholder.filter_table_view": "篩選資料表或檢視",
"sidebar.placeholder.select_connection": "請選擇連線",
"sidebar.placeholder.select_connection_first": "請先選擇連線",
@@ -7211,10 +7216,6 @@
"sidebar.search.manual_scope": "手動範圍",
"sidebar.search.multi_select_supported": "支援多選",
"sidebar.search.placeholder": "搜尋...",
- "sidebar.search.scope_description": "選擇側邊欄搜尋的比對範圍。",
- "sidebar.search.scope_hint": "智慧模式會依內容搜尋名稱、主機、資料庫和物件。",
- "sidebar.search.scope_title": "搜尋範圍",
- "sidebar.search.scope_tooltip": "目前搜尋範圍:{{scope}}",
"sidebar.search.scope.database": "資料庫",
"sidebar.search.scope.host": "主機",
"sidebar.search.scope.object": "物件",
@@ -7222,19 +7223,24 @@
"sidebar.search.scope.smart_description": "依目前選取的節點自動縮小搜尋範圍。",
"sidebar.search.scope.smart_short": "智慧",
"sidebar.search.scope.tag": "標籤",
+ "sidebar.search.scope_description": "選擇側邊欄搜尋的比對範圍。",
+ "sidebar.search.scope_hint": "智慧模式會依內容搜尋名稱、主機、資料庫和物件。",
+ "sidebar.search.scope_title": "搜尋範圍",
+ "sidebar.search.scope_tooltip": "目前搜尋範圍:{{scope}}",
"sidebar.sql_directory.default_name": "SQL 目錄",
+ "sidebar.sql_file.default_name": "SQL 檔案",
"sidebar.sql_file_exec.cancel": "取消執行",
"sidebar.sql_file_exec.executed_label": "已執行:",
"sidebar.sql_file_exec.file_size": "檔案大小:",
+ "sidebar.sql_file_exec.message.already_running": "目前已有外部 SQL 執行任務在進行中",
"sidebar.sql_file_exec.rows_separator": " 列 | 失敗:",
"sidebar.sql_file_exec.rows_suffix": " 列",
- "sidebar.sql_file_exec.status_label": "狀態:",
"sidebar.sql_file_exec.status.cancelled": "已終止",
"sidebar.sql_file_exec.status.done": "完成",
"sidebar.sql_file_exec.status.error": "錯誤",
"sidebar.sql_file_exec.status.running": "執行中",
+ "sidebar.sql_file_exec.status_label": "狀態:",
"sidebar.sql_file_exec.title": "執行外部 SQL 檔案",
- "sidebar.sql_file_exec.message.already_running": "目前已有外部 SQL 執行任務在進行中",
"sidebar.sql_file_exec.workbench.action.clear_history": "清空歷史",
"sidebar.sql_file_exec.workbench.action.run_again": "重新執行",
"sidebar.sql_file_exec.workbench.description.current_task_empty": "目前尚未執行任務,選取檔案後會在這裡持續顯示進度。",
@@ -7250,7 +7256,6 @@
"sidebar.sql_file_exec.workbench.label.started_at": "開始時間",
"sidebar.sql_file_exec.workbench.section.config": "執行設定",
"sidebar.sql_file_exec.workbench.stage.preparing": "準備執行",
- "sidebar.sql_file.default_name": "SQL 檔案",
"sidebar.sql_template.duckdb_macro_hint": "使用 SQL Macro 實作類似函式的行為",
"sidebar.sql_template.duckdb_procedure_unsupported": "DuckDB 尚不支援預存程序",
"sidebar.sql_template.edit_routine": "編輯 {{type}} {{name}}",
@@ -7312,8 +7317,8 @@
"sidebar.v2_schema_menu.export_current_schema_sql": "匯出目前模式的資料表結構 · SQL",
"sidebar.v2_schema_menu.meta": "{{database}} · 模式操作",
"sidebar.v2_table_group_menu.current_database": "目前資料庫",
- "sidebar.v2_table_group_menu.display_section": "顯示",
"sidebar.v2_table_group_menu.display_create_time": "顯示建立時間",
+ "sidebar.v2_table_group_menu.display_section": "顯示",
"sidebar.v2_table_group_menu.display_table_rows": "顯示資料列數",
"sidebar.v2_table_group_menu.display_table_size": "顯示資料表大小",
"sidebar.v2_table_group_menu.display_update_time": "顯示修改時間",
@@ -7407,14 +7412,6 @@
"sql_analysis.backend.error.select_only": "診斷僅支援 SELECT / WITH 查詢;寫入操作請改用 EXPLAIN PLAN 模式(PR2 支援)",
"sql_analysis.backend.error.unsupported_db_type": "目前資料來源({{dbType}})暫不支援 SQL 診斷;一期支援 MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase",
"sql_analysis.backend.message.completed": "診斷完成",
- "sql_analysis.explain_graph.flag.filesort": "額外排序",
- "sql_analysis.explain_graph.flag.full_scan": "全表掃描",
- "sql_analysis.explain_graph.flag.temp_table": "暫存表",
- "sql_analysis.explain_graph.label.index": "索引:",
- "sql_analysis.explain_graph.label.table": "表:",
- "sql_analysis.explain_graph.metric.actual_rows": "實際",
- "sql_analysis.explain_graph.metric.cost": "成本",
- "sql_analysis.explain_graph.metric.est_rows": "估算",
"sql_analysis.explain.empty": "輸入 SQL 後執行診斷",
"sql_analysis.explain.error.query_required": "查詢語句為空",
"sql_analysis.explain.error.run_failed": "診斷失敗",
@@ -7424,6 +7421,14 @@
"sql_analysis.explain.raw.empty": "(無原文)",
"sql_analysis.explain.view.plan": "執行計畫",
"sql_analysis.explain.view.raw": "原文",
+ "sql_analysis.explain_graph.flag.filesort": "額外排序",
+ "sql_analysis.explain_graph.flag.full_scan": "全表掃描",
+ "sql_analysis.explain_graph.flag.temp_table": "暫存表",
+ "sql_analysis.explain_graph.label.index": "索引:",
+ "sql_analysis.explain_graph.label.table": "表:",
+ "sql_analysis.explain_graph.metric.actual_rows": "實際",
+ "sql_analysis.explain_graph.metric.cost": "成本",
+ "sql_analysis.explain_graph.metric.est_rows": "估算",
"sql_analysis.sidebar.node.actual_rows": "實際行數",
"sql_analysis.sidebar.node.buffer_hit": "快取命中",
"sql_analysis.sidebar.node.cost": "成本",
@@ -7521,6 +7526,9 @@
"store.fallback.connection_tag_name": "標籤-{{index}}",
"store.fallback.sql_snippet_name": "片段-{{index}}",
"tab_manager.close_aria": "關閉 {{title}}",
+ "tab_manager.detached.close": "關閉視窗",
+ "tab_manager.detached.restore": "還原為標籤頁",
+ "tab_manager.detached.title_fallback": "獨立視窗",
"tab_manager.empty.action.open_ai": "開啟 AI",
"tab_manager.empty.aria.start_workbench": "GoNavi 起始工作台",
"tab_manager.empty.eyebrow.connections": "{{count}} 個連線",
@@ -7584,6 +7592,8 @@
"tab_manager.menu.close_left": "關閉左側分頁",
"tab_manager.menu.close_other": "關閉其他分頁",
"tab_manager.menu.close_right": "關閉右側分頁",
+ "tab_manager.menu.open_in_window": "在獨立視窗開啟",
+ "tab_manager.menu.restore_to_tab": "還原為標籤頁",
"tab_manager.menu.tab_display_settings": "標籤設定",
"tab_manager.sql_file_close.close_tabs": "關閉分頁",
"tab_manager.sql_file_close.continue_close": "繼續關閉",
@@ -7924,8 +7934,8 @@
"web_auth.error.setup_info_expired": "初始化資訊已失效,請重新整理頁面後再試",
"web_auth.error.setup_required": "需要先完成瀏覽器訪問驗證初始化",
"web_auth.error.setup_token_expired": "初始化權杖已過期,請重新整理頁面後再試",
- "web_auth.error.totp_code_required": "請輸入 Google Authenticator 驗證碼或復原碼",
"web_auth.error.too_many_login_attempts": "登入失敗次數過多,請稍後再試",
+ "web_auth.error.totp_code_required": "請輸入 Google Authenticator 驗證碼或復原碼",
"web_auth.page.login.code_label": "Google Authenticator 驗證碼 / 復原碼",
"web_auth.page.login.code_placeholder": "6 位驗證碼或復原碼",
"web_auth.page.login.description": "瀏覽器訪問版預設使用伺服器端工作階段。閒置逾時、絕對逾時與記住登入時長由伺服器統一控制。",
@@ -7962,6 +7972,7 @@
"web_auth.page.setup.recovery_intro": "復原碼只會顯示這一次,建議離線保存:",
"web_auth.page.setup.remember_label": "記住登入(天)",
"web_auth.page.setup.secret_label": "密鑰",
+ "web_auth.page.setup.session_title": "工作階段策略",
"web_auth.page.setup.step_admin_description": "先完成瀏覽器訪問口令",
"web_auth.page.setup.step_admin_hint": "先設定管理員密碼,並決定是否啟用 Google Authenticator 2FA。",
"web_auth.page.setup.step_admin_title": "建立管理員密碼",
@@ -7971,7 +7982,6 @@
"web_auth.page.setup.step_totp_description": "掃碼或手動輸入 TOTP",
"web_auth.page.setup.step_totp_hint": "如果啟用了 2FA,請在這裡完成掃碼綁定,並輸入第一個驗證碼確認設定。",
"web_auth.page.setup.step_totp_title": "綁定驗證器",
- "web_auth.page.setup.session_title": "工作階段策略",
"web_auth.page.setup.submit": "完成初始化並進入 GoNavi",
"web_auth.page.setup.subtitle": "首次啟動需要建立管理員密碼,並建議立即綁定 Google Authenticator",
"web_auth.page.setup.title": "初始化 GoNavi Web",