diff --git a/src/renderer/src/components/connection/ConnectionList.vue b/src/renderer/src/components/connection/ConnectionList.vue index cd8f49d..1f9c201 100644 --- a/src/renderer/src/components/connection/ConnectionList.vue +++ b/src/renderer/src/components/connection/ConnectionList.vue @@ -31,9 +31,19 @@ function closeCtxMenu() { ctxMenu.value.visible = false } -function ctxConnect() { - if (ctxMenu.value.conn) connStore.connect(ctxMenu.value.conn) +async function ctxConnect() { + if (!ctxMenu.value.conn) return closeCtxMenu() + try { + await connStore.connect(ctxMenu.value.conn) + if (connStore.error) { + ElMessage.error(connStore.error || t('connection.connectFailed')) + } else { + ElMessage.success(t('connection.connectSuccess')) + } + } catch (err: any) { + ElMessage.error(err.message || t('connection.connectFailed')) + } } function ctxDisconnect() { @@ -140,7 +150,7 @@ async function handleExport() { a.download = `jredis-connections-${new Date().toISOString().slice(0, 10)}.json` a.click() URL.revokeObjectURL(url) - ElMessage.success('Connections exported') + ElMessage.success(t('connection.exported')) } catch (err: any) { ElMessage.error(err.message) } @@ -149,12 +159,12 @@ async function handleExport() { async function handleImport() { try { const result = await window.electronAPI.dialog.openFile({ - title: 'Import Connections', + title: t('connection.importTitle'), filters: [{ name: 'JSON', extensions: ['json'] }], }) if (result) { const count = await connStore.importConnections(result.content) - ElMessage.success(`Imported ${count} connection(s)`) + ElMessage.success(t('connection.imported', { n: count })) await connStore.loadConnections() } } catch (err: any) { diff --git a/src/renderer/src/components/connection/NewConnectionDialog.vue b/src/renderer/src/components/connection/NewConnectionDialog.vue index 6f65705..7a5f0cc 100644 --- a/src/renderer/src/components/connection/NewConnectionDialog.vue +++ b/src/renderer/src/components/connection/NewConnectionDialog.vue @@ -134,7 +134,7 @@ async function selectTlsKeyFile() { async function handleTest() { if (!form.host.trim()) { - ElMessage.warning('Host is required') + ElMessage.warning(t('connection.hostRequired')) return } testing.value = true @@ -164,9 +164,9 @@ async function handleTest() { sshPassphrase: form.sshPassphrase, } as any) if (result.success) { - ElMessage.success('Connection successful') + ElMessage.success(t('connection.testSuccess')) } else { - ElMessage.error(result.error || 'Connection failed') + ElMessage.error(result.error || t('connection.testFailed')) } } finally { testing.value = false @@ -175,7 +175,7 @@ async function handleTest() { async function handleSave() { if (!form.name.trim() || !form.host.trim()) { - ElMessage.warning('Name and host are required') + ElMessage.warning(t('connection.nameHostRequired')) return } saving.value = true @@ -211,10 +211,10 @@ async function handleSave() { createdAt: props.connection?.createdAt ?? Date.now(), } await connStore.saveConnection(conn) - ElMessage.success(isEdit.value ? 'Connection updated' : 'Connection created') + ElMessage.success(isEdit.value ? t('connection.updated') : t('connection.created')) close() } catch (err: any) { - ElMessage.error(err.message || 'Failed to save connection') + ElMessage.error(err.message || t('connection.saveFailed')) } finally { saving.value = false } diff --git a/src/renderer/src/i18n/locales/de.ts b/src/renderer/src/i18n/locales/de.ts index 265e059..5cb9a76 100644 --- a/src/renderer/src/i18n/locales/de.ts +++ b/src/renderer/src/i18n/locales/de.ts @@ -74,6 +74,17 @@ export default { duplicate: 'Duplizieren', setColor: 'Farbe festlegen', duplicated: 'Verbindung dupliziert', + hostRequired: 'Host ist erforderlich', + nameHostRequired: 'Name und Host sind erforderlich', + connectSuccess: 'Verbunden', + connectFailed: 'Verbindung fehlgeschlagen', + created: 'Verbindung erstellt', + updated: 'Verbindung aktualisiert', + saveFailed: 'Verbindung konnte nicht gespeichert werden', + exported: 'Verbindungen exportiert', + importTitle: 'Verbindungen importieren', + imported: '{n} Verbindung(en) importiert', + serverInfoUnavailable: 'Verbindung hergestellt, aber Serverinformationen nicht verfügbar', }, key: { title: 'Schlüssel', diff --git a/src/renderer/src/i18n/locales/en.ts b/src/renderer/src/i18n/locales/en.ts index b4224d0..254e014 100644 --- a/src/renderer/src/i18n/locales/en.ts +++ b/src/renderer/src/i18n/locales/en.ts @@ -74,6 +74,17 @@ export default { duplicate: 'Duplicate', setColor: 'Set Color', duplicated: 'Connection duplicated', + hostRequired: 'Host is required', + nameHostRequired: 'Name and host are required', + connectSuccess: 'Connected', + connectFailed: 'Connection failed', + created: 'Connection created', + updated: 'Connection updated', + saveFailed: 'Failed to save connection', + exported: 'Connections exported', + importTitle: 'Import Connections', + imported: 'Imported {n} connection(s)', + serverInfoUnavailable: 'Connection established but server info unavailable', }, key: { title: 'Keys', diff --git a/src/renderer/src/i18n/locales/ja.ts b/src/renderer/src/i18n/locales/ja.ts index c929fdb..2d628c9 100644 --- a/src/renderer/src/i18n/locales/ja.ts +++ b/src/renderer/src/i18n/locales/ja.ts @@ -74,6 +74,17 @@ export default { duplicate: '複製', setColor: '色を設定', duplicated: '接続が複製されました', + hostRequired: 'ホストは必須です', + nameHostRequired: '名前とホストは必須です', + connectSuccess: '接続しました', + connectFailed: '接続に失敗しました', + created: '接続が作成されました', + updated: '接続が更新されました', + saveFailed: '接続の保存に失敗しました', + exported: '接続がエクスポートされました', + importTitle: '接続をインポート', + imported: '{n} 個の接続をインポートしました', + serverInfoUnavailable: '接続は確立されましたが、サーバー情報が利用できません', }, key: { title: 'キー', diff --git a/src/renderer/src/i18n/locales/ko.ts b/src/renderer/src/i18n/locales/ko.ts index 4e19b1a..a013990 100644 --- a/src/renderer/src/i18n/locales/ko.ts +++ b/src/renderer/src/i18n/locales/ko.ts @@ -74,6 +74,17 @@ export default { duplicate: '복제', setColor: '색상 설정', duplicated: '연결이 복제되었습니다', + hostRequired: '호스트는 필수입니다', + nameHostRequired: '이름과 호스트는 필수입니다', + connectSuccess: '연결됨', + connectFailed: '연결 실패', + created: '연결이 생성되었습니다', + updated: '연결이 업데이트되었습니다', + saveFailed: '연결 저장 실패', + exported: '연결이 내보내기되었습니다', + importTitle: '연결 가져오기', + imported: '{n}개 연결을 가져왔습니다', + serverInfoUnavailable: '연결이 확립되었지만 서버 정보를 사용할 수 없습니다', }, key: { title: '키', diff --git a/src/renderer/src/i18n/locales/zh-CN.ts b/src/renderer/src/i18n/locales/zh-CN.ts index 26bd5c4..1435a37 100644 --- a/src/renderer/src/i18n/locales/zh-CN.ts +++ b/src/renderer/src/i18n/locales/zh-CN.ts @@ -74,6 +74,17 @@ export default { duplicate: '复制连接', setColor: '设置颜色', duplicated: '连接已复制', + hostRequired: '主机必填', + nameHostRequired: '名称和主机必填', + connectSuccess: '连接成功', + connectFailed: '连接失败', + created: '连接已创建', + updated: '连接已更新', + saveFailed: '保存连接失败', + exported: '连接已导出', + importTitle: '导入连接', + imported: '已导入 {n} 个连接', + serverInfoUnavailable: '连接已建立但服务器信息不可用', }, key: { title: '键值', diff --git a/src/renderer/src/stores/connection.ts b/src/renderer/src/stores/connection.ts index 4eac32e..8aa11af 100644 --- a/src/renderer/src/stores/connection.ts +++ b/src/renderer/src/stores/connection.ts @@ -1,5 +1,6 @@ import { defineStore } from 'pinia' import { ref, computed } from 'vue' +import { useI18n } from '@renderer/i18n' export interface ConnectionConfig { id: string @@ -34,6 +35,7 @@ export interface ConnectionConfig { } export const useConnectionStore = defineStore('connection', () => { + const { t } = useI18n() const connections = ref([]) const activeId = ref(null) const connectedIds = ref([]) @@ -138,7 +140,7 @@ export const useConnectionStore = defineStore('connection', () => { // leaving the renderer in a state where isConnected is true but no // actual Redis client exists in the main process. await disconnectById(conn.id) - error.value = 'Connection established but server info unavailable' + error.value = t('connection.serverInfoUnavailable') return } // Restore last selected DB for this connection @@ -151,7 +153,7 @@ export const useConnectionStore = defineStore('connection', () => { currentDb.value = lastDb startHealthCheck(conn.id) } else { - error.value = result.error || 'Connection failed' + error.value = result.error || t('connection.connectFailed') } } catch (err: any) { error.value = err.message