From 864797fc9903498c9894001468e50c141f1a383b Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 26 Oct 2025 09:33:48 +0100 Subject: [PATCH 001/124] MPR advanced exports --- packages/web/src/appobj/DatabaseAppObject.svelte | 2 ++ packages/web/src/commands/stdCommands.ts | 2 +- packages/web/src/modals/NewObjectModal.svelte | 1 + packages/web/src/utility/createQuickExportMenu.ts | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index 671d5b64e..58a444190 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -468,12 +468,14 @@ await dbgateApi.executeQuery(${JSON.stringify( { divider: true }, isSqlOrDoc && + isProApp() && !connection.isReadOnly && hasPermission(`dbops/import`) && { onClick: handleImport, text: _t('database.import', { defaultMessage: 'Import' }), }, isSqlOrDoc && + isProApp() && hasPermission(`dbops/export`) && { onClick: handleExport, text: _t('database.export', { defaultMessage: 'Export' }), diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index cbf82fc72..b9b8d67fa 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -689,7 +689,7 @@ registerCommand({ name: 'Export database', toolbar: true, icon: 'icon export', - testEnabled: () => getCurrentDatabase() != null && hasPermission(`dbops/export`), + testEnabled: () => getCurrentDatabase() != null && hasPermission(`dbops/export`) && isProApp(), onClick: () => { openImportExportTab({ targetStorageType: getDefaultFileFormat(getExtensions()).storageType, diff --git a/packages/web/src/modals/NewObjectModal.svelte b/packages/web/src/modals/NewObjectModal.svelte index 99d140694..eb08b9f98 100644 --- a/packages/web/src/modals/NewObjectModal.svelte +++ b/packages/web/src/modals/NewObjectModal.svelte @@ -94,6 +94,7 @@ title: 'Export database', description: 'Export to file like CSV, JSON, Excel, or other DB', command: 'database.export', + isProFeature: true, testid: 'NewObjectModal_databaseExport', disabledMessage: 'Export is not available for current database', }, diff --git a/packages/web/src/utility/createQuickExportMenu.ts b/packages/web/src/utility/createQuickExportMenu.ts index 467ec1d74..a3cdc69c6 100644 --- a/packages/web/src/utility/createQuickExportMenu.ts +++ b/packages/web/src/utility/createQuickExportMenu.ts @@ -1,11 +1,12 @@ import type { QuickExportDefinition } from 'dbgate-types'; import { currentArchive, getCurrentArchive, getExtensions } from '../stores'; import hasPermission from './hasPermission'; +import { isProApp } from './proTools'; export function createQuickExportMenuItems(handler: (fmt: QuickExportDefinition) => Function, advancedExportMenuItem) { const extensions = getExtensions(); return [ - { + isProApp() && { text: 'Export advanced...', ...advancedExportMenuItem, }, From 6ce82e915edd0bc81f236fa075a0a28b7282573f Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 26 Oct 2025 15:04:13 +0100 Subject: [PATCH 002/124] MPR grouping --- .../src/datagrid/ColumnHeaderControl.svelte | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/web/src/datagrid/ColumnHeaderControl.svelte b/packages/web/src/datagrid/ColumnHeaderControl.svelte index 669e4e44e..1d7e33872 100644 --- a/packages/web/src/datagrid/ColumnHeaderControl.svelte +++ b/packages/web/src/datagrid/ColumnHeaderControl.svelte @@ -12,6 +12,7 @@ import { showModal } from '../modals/modalTools'; import DefineDictionaryDescriptionModal from '../modals/DefineDictionaryDescriptionModal.svelte'; import { sleep } from '../utility/common'; + import { isProApp } from '../utility/proTools'; export let column; export let conid = undefined; @@ -72,21 +73,25 @@ column.foreignKey && [{ divider: true }, { onClick: openReferencedTable, text: column.foreignKey.refTableName }], - setGrouping && { divider: true }, - setGrouping && { onClick: () => setGrouping('GROUP'), text: 'Group by' }, - setGrouping && { onClick: () => setGrouping('MAX'), text: 'MAX' }, - setGrouping && { onClick: () => setGrouping('MIN'), text: 'MIN' }, - setGrouping && { onClick: () => setGrouping('SUM'), text: 'SUM' }, - setGrouping && { onClick: () => setGrouping('AVG'), text: 'AVG' }, - setGrouping && { onClick: () => setGrouping('COUNT'), text: 'COUNT' }, - setGrouping && { onClick: () => setGrouping('COUNT DISTINCT'), text: 'COUNT DISTINCT' }, + isProApp() && + setGrouping && [ + { divider: true }, + { onClick: () => setGrouping('GROUP'), text: 'Group by' }, + { onClick: () => setGrouping('MAX'), text: 'MAX' }, + { onClick: () => setGrouping('MIN'), text: 'MIN' }, + { onClick: () => setGrouping('SUM'), text: 'SUM' }, + { onClick: () => setGrouping('AVG'), text: 'AVG' }, + { onClick: () => setGrouping('COUNT'), text: 'COUNT' }, + { onClick: () => setGrouping('COUNT DISTINCT'), text: 'COUNT DISTINCT' }, + ], - isTypeDateTime(column.dataType) && [ - { divider: true }, - { onClick: () => setGrouping('GROUP:YEAR'), text: 'Group by YEAR' }, - { onClick: () => setGrouping('GROUP:MONTH'), text: 'Group by MONTH' }, - { onClick: () => setGrouping('GROUP:DAY'), text: 'Group by DAY' }, - ], + isProApp() && + isTypeDateTime(column.dataType) && [ + { divider: true }, + { onClick: () => setGrouping('GROUP:YEAR'), text: 'Group by YEAR' }, + { onClick: () => setGrouping('GROUP:MONTH'), text: 'Group by MONTH' }, + { onClick: () => setGrouping('GROUP:DAY'), text: 'Group by DAY' }, + ], { divider: true }, From 9f0107c0027ac8b82dcf36a7ac963f72f44b18d0 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 26 Oct 2025 18:06:45 +0100 Subject: [PATCH 003/124] MPR refs, macros --- packages/web/src/datagrid/DataGrid.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/web/src/datagrid/DataGrid.svelte b/packages/web/src/datagrid/DataGrid.svelte index 42725ae41..c6193230b 100644 --- a/packages/web/src/datagrid/DataGrid.svelte +++ b/packages/web/src/datagrid/DataGrid.svelte @@ -68,6 +68,7 @@ import registerCommand from '../commands/registerCommand'; import { registerMenu } from '../utility/contextMenu'; import { getLocalStorage, setLocalStorage } from '../utility/storageCache'; + import { isProApp } from '../utility/proTools'; export let config; export let setConfig; @@ -205,7 +206,7 @@ name="references" height="30%" collapsed={isDetailView} - skip={!(showReferences && display?.hasReferences)} + skip={!(showReferences && display?.hasReferences && isProApp())} data-testid="DataGrid_itemReferences" > @@ -214,7 +215,7 @@ From f974c00a63c9804653e1938aee7cd30af636a280 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 26 Oct 2025 18:23:07 +0100 Subject: [PATCH 004/124] MPR references --- packages/datalib/src/TableGridDisplay.ts | 4 +++- .../src/datagrid/ColumnHeaderControl.svelte | 12 +++++++----- .../web/src/datagrid/ColumnManagerRow.svelte | 19 ++++++++++++------- .../web/src/datagrid/TableDataGrid.svelte | 4 +++- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 9d25f44b8..9adbc7a5b 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -39,7 +39,8 @@ export class TableGridDisplay extends GridDisplay { public getDictionaryDescription: DictionaryDescriptionFunc = null, isReadOnly = false, public isRawMode = false, - public currentSettings = null + public currentSettings = null, + public areReferencesAllowed = true ) { super(config, setConfig, cache, setCache, driver, dbinfo, serverVersion, currentSettings); @@ -248,6 +249,7 @@ export class TableGridDisplay extends GridDisplay { } processReferences(select: Select, displayedColumnInfo: DisplayedColumnInfo, options) { + if (!this.areReferencesAllowed) return; this.addJoinsFromExpandedColumns(select, this.columns, 'basetbl', displayedColumnInfo); if (!options.isExport && this.displayOptions.showHintColumns) { this.addHintsToSelect(select); diff --git a/packages/web/src/datagrid/ColumnHeaderControl.svelte b/packages/web/src/datagrid/ColumnHeaderControl.svelte index 1d7e33872..6ecc61757 100644 --- a/packages/web/src/datagrid/ColumnHeaderControl.svelte +++ b/packages/web/src/datagrid/ColumnHeaderControl.svelte @@ -95,11 +95,13 @@ { divider: true }, - allowDefineVirtualReferences && { onClick: handleDefineVirtualForeignKey, text: 'Define virtual foreign key' }, - column.foreignKey && { - onClick: handleCustomizeDescriptions, - text: 'Customize description', - }, + isProApp() && + allowDefineVirtualReferences && { onClick: handleDefineVirtualForeignKey, text: 'Define virtual foreign key' }, + column.foreignKey && + isProApp() && { + onClick: handleCustomizeDescriptions, + text: 'Customize description', + }, ]; } diff --git a/packages/web/src/datagrid/ColumnManagerRow.svelte b/packages/web/src/datagrid/ColumnManagerRow.svelte index 9d55f241b..630af469d 100644 --- a/packages/web/src/datagrid/ColumnManagerRow.svelte +++ b/packages/web/src/datagrid/ColumnManagerRow.svelte @@ -7,6 +7,7 @@ import { showModal } from '../modals/modalTools'; import ColumnEditorModal from '../tableeditor/ColumnEditorModal.svelte'; import { editorDeleteColumn } from 'dbgate-tools'; + import { isProApp } from '../utility/proTools'; export let column; export let display; @@ -59,13 +60,17 @@ on:mouseup >
- - display.toggleExpandedColumn(column.uniqueName)} - data-testid="ColumnManagerRow_expand_{column.uniqueName}" - /> - + {#if isProApp()} + + display.toggleExpandedColumn(column.uniqueName)} + data-testid="ColumnManagerRow_expand_{column.uniqueName}" + /> + + {/if} {#if isJsonView} {:else} diff --git a/packages/web/src/datagrid/TableDataGrid.svelte b/packages/web/src/datagrid/TableDataGrid.svelte index 46d0b434b..a8dcc8445 100644 --- a/packages/web/src/datagrid/TableDataGrid.svelte +++ b/packages/web/src/datagrid/TableDataGrid.svelte @@ -30,6 +30,7 @@ import SqlFormView from '../formview/SqlFormView.svelte'; import { getBoolSettingsValue } from '../settings/settingsTools'; import { getDictionaryDescription } from '../utility/dictionaryDescriptionTools'; + import { isProApp } from '../utility/proTools'; export let conid; export let database; @@ -82,7 +83,8 @@ extendedDbInfo?.tables?.find(x => x.pureName == pureName && x.schemaName == schemaName) ?.tablePermissionRole == 'read', isRawMode, - $settingsValue + $settingsValue, + isProApp() ) : null; From 391d04b45c8b7aaa860d52dbafc55682deefc12b Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 26 Oct 2025 18:28:35 +0100 Subject: [PATCH 005/124] MPR archive --- packages/web/src/utility/createQuickExportMenu.ts | 2 +- packages/web/src/widgets/StatusBar.svelte | 3 ++- packages/web/src/widgets/WidgetContainer.svelte | 3 ++- packages/web/src/widgets/WidgetIconPanel.svelte | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/web/src/utility/createQuickExportMenu.ts b/packages/web/src/utility/createQuickExportMenu.ts index a3cdc69c6..9e43179ee 100644 --- a/packages/web/src/utility/createQuickExportMenu.ts +++ b/packages/web/src/utility/createQuickExportMenu.ts @@ -16,7 +16,7 @@ export function createQuickExportMenuItems(handler: (fmt: QuickExportDefinition) onClick: handler(fmt), })), { divider: true }, - { + isProApp() && { text: 'Current archive', onClick: handler({ extension: 'jsonl', diff --git a/packages/web/src/widgets/StatusBar.svelte b/packages/web/src/widgets/StatusBar.svelte index aad507563..4fa3f6c1d 100644 --- a/packages/web/src/widgets/StatusBar.svelte +++ b/packages/web/src/widgets/StatusBar.svelte @@ -27,6 +27,7 @@ import { useConnectionColor } from '../utility/useConnectionColor'; import { apiCall } from '../utility/api'; import { statusBarTabInfo } from '../utility/statusBarStore'; + import { isProApp } from '../utility/proTools'; $: databaseName = $currentDatabase && $currentDatabase.name; $: connection = $currentDatabase && $currentDatabase.connection; @@ -155,7 +156,7 @@
{/if} - {#if $currentArchive && $currentArchive != 'default'} + {#if isProApp() && $currentArchive && $currentArchive != 'default'}
{#if hasPermission('widgets/database')} @@ -22,7 +23,7 @@ {#if $visibleSelectedWidget == 'history' && hasPermission('widgets/history')} {/if} -{#if $visibleSelectedWidget == 'archive' && hasPermission('widgets/archive')} +{#if $visibleSelectedWidget == 'archive' && hasPermission('widgets/archive') && isProApp()} {/if} {#if $visibleSelectedWidget == 'plugins' && hasPermission('widgets/plugins')} diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 5f3c1ff06..f2d0850f5 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -60,7 +60,7 @@ name: 'history', title: 'Query history & Closed tabs', }, - { + isProApp() && { icon: 'icon archive', name: 'archive', title: 'Archive (saved tabular data)', From c514a4d5035e2382c7a49f8259301aef173285ec Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 09:33:26 +0100 Subject: [PATCH 006/124] translation-settings,common --- .../web/src/settings/SettingsModal.svelte | 207 ++++++++-------- packages/web/src/translations.ts | 2 + translations/cs.json | 232 +++++++++++++++++- translations/en.json | 164 ++++++++++++- translations/sk.json | 231 +++++++++++++++++ 5 files changed, 732 insertions(+), 104 deletions(-) create mode 100644 translations/sk.json diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte index a68f98941..198c01009 100644 --- a/packages/web/src/settings/SettingsModal.svelte +++ b/packages/web/src/settings/SettingsModal.svelte @@ -44,6 +44,10 @@ import AiSettingsTab from './AiSettingsTab.svelte'; import { _t } from '../translations'; import hasPermission from '../utility/hasPermission'; + import ConfirmModal from '../modals/ConfirmModal.svelte'; + import { showModal } from '../modals/modalTools'; + import { internalRedirectTo } from '../clientAuth'; + import { getSelectedLanguage } from '../translations'; const electron = getElectron(); let restartWarning = false; @@ -93,7 +97,7 @@ ORDER BY -
Settings
+
{_t('settings.title', { defaultMessage: 'Settings' })}
{#if electron} -
Appearance
+
{_t('settings.appearance', { defaultMessage: 'Appearance' })}
{#if restartWarning}
- Native menu settings will be applied after app restart + {_t('settings.nativeMenuRestartWarning', { defaultMessage: 'Native menu settings will be applied after app restart' })}
{/if} {/if} -
Data grid
+
{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}
- + - + - + -
SQL editor
+
{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}
- +
- + ($currentEditorWrapEnabled = e.target.checked)} @@ -243,33 +247,33 @@ ORDER BY -
Connection
+
{_t('settings.connection', { defaultMessage: 'Connection' })}
{ @@ -282,17 +286,17 @@ ORDER BY -
Query sessions
+
{_t('settings.session', { defaultMessage: 'Query sessions' })}
-
Application theme
+
{_t('settings.appearance', { defaultMessage: 'Application theme' })}
{ @@ -352,19 +356,19 @@ ORDER BY
- More themes are available as plugins + {_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })} plugins
- After installing theme plugin (try search "theme" in available extensions) new themes will be available here. + {_t('settings.appearance.afterInstalling', { defaultMessage: 'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.' })}
-
Editor theme
+
{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}
- + ({ label: theme, value: theme }))} value={$currentEditorTheme} on:change={e => ($currentEditorTheme = e.detail)} @@ -373,7 +377,7 @@ ORDER BY
- +
- + ($currentEditorFontSize = e.target['value'])} @@ -396,7 +400,7 @@ ORDER BY
- +
@@ -405,68 +409,68 @@ ORDER BY
-
Default actions
+
{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}
- +
-
Behaviour
+
{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}
- +
- When you single-click or select a file in the "Tables, Views, Functions" view, it - is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing - tables and don't want every visited table to have its own tab. When you start editing the table or use double-click - to open the table from the "Tables" view, a new tab is dedicated to that table. + {_t('settings.behaviour.singleClickPreview', { defaultMessage: 'When you single-click or select a file in the "Tables, Views, Functions" view, it is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing tables and don\'t want every visited table to have its own tab. When you start editing the table or use double-click to open the table from the "Tables" view, a new tab is dedicated to that table.' })}
-
Confirmations
+
{_t('settings.confirmations', { defaultMessage: 'Confirmations' })}
- +
-
Other
+
{_t('settings.other', { defaultMessage: 'Other' })}
- + {#if isProApp()} {/if}
-
License
+
{_t('settings.other.license', { defaultMessage: 'License' })}
{ licenseKeyCheckResult = await apiCall('config/check-license', { licenseKey: value }); @@ -536,28 +537,28 @@ ORDER BY
{#if licenseKeyCheckResult.status == 'ok'}
- License key is valid + { _t('settings.other.licenseKey.valid', { defaultMessage: 'License key is valid' }) }
{#if licenseKeyCheckResult.validTo}
- License valid to: {licenseKeyCheckResult.validTo} + { _t('settings.other.licenseKey.validTo', { defaultMessage: 'License valid to:' }) } {licenseKeyCheckResult.validTo}
{/if} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if} {:else if licenseKeyCheckResult.status == 'error'}
- {licenseKeyCheckResult.errorMessage ?? 'License key is invalid'} + {licenseKeyCheckResult.errorMessage ?? _t('settings.other.licenseKey.invalid', { defaultMessage: 'License key is invalid' })} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if}
{#if licenseKeyCheckResult.isExpired}
{ licenseKeyCheckResult = await apiCall('config/get-new-license', { oldLicenseKey: licenseKey }); @@ -574,24 +575,32 @@ ORDER BY -
External tools
+
{_t('settings.externalTools', { defaultMessage: 'External tools' })}
- + - +
@@ -602,7 +611,7 @@ ORDER BY
- +
diff --git a/packages/web/src/translations.ts b/packages/web/src/translations.ts index c6bbb56a4..b1665567b 100644 --- a/packages/web/src/translations.ts +++ b/packages/web/src/translations.ts @@ -1,4 +1,5 @@ import cs from '../../../translations/cs.json'; +import sk from '../../../translations/sk.json'; import MessageFormat, { MessageFunction } from '@messageformat/core'; import { getStringSettingsValue } from './settings/settingsTools'; @@ -6,6 +7,7 @@ import { getStringSettingsValue } from './settings/settingsTools'; const translations = { en: {}, cs, + sk, }; const supportedLanguages = Object.keys(translations); diff --git a/translations/cs.json b/translations/cs.json index 0967ef424..735ada06f 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -1 +1,231 @@ -{} +{ + "app.databaseName": "Název databáze", + "app.preparingPlugins": "Příprava pluginů...", + "app.starting": "Spouštění DbGate", + "authToken": "Auth token", + "column.copyName": "Kopírovat název", + "column.dropColumn": "Odstranit sloupec", + "column.renameColumn": "Přejmenovat sloupec", + "command.datagrid.addNewColumn": "Přidat nový sloupec", + "command.datagrid.addNewColumn.toolbar": "Nový sloupec", + "command.datagrid.cloneRows": "Klonovat řádky", + "command.datagrid.cloneRows.toolbar": "Klonovat řádek(y)", + "command.datagrid.copyToClipboard": "Kopírovat do schránky", + "command.datagrid.deleteSelectedRows": "Odstranit vybrané řádky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstranit řádek(y)", + "command.datagrid.editJsonDocument": "Upravit řádek jako JSON dokument", + "command.datagrid.insertNewRow": "Vložit nový řádek", + "command.datagrid.insertNewRow.toolbar": "Nový řádek", + "command.datagrid.loadCellFromFile": "Načíst buňku ze souboru", + "command.datagrid.openJsonArrayInSheet": "Otevřít pole jako tabulku", + "command.datagrid.openSelectionInMap": "Otevřít výběr v mapě", + "command.datagrid.reconnect": "Znovu připojit", + "command.datagrid.redo": "Znovu", + "command.datagrid.removeField": "Odstranit pole", + "command.datagrid.revertAllChanges": "Vrátit všechny změny", + "command.datagrid.revertAllChanges.toolbar": "Vrátit vše", + "command.datagrid.revertRowChanges": "Vrátit změny řádku", + "command.datagrid.saveCellToFile": "Uložit buňku do souboru", + "command.datagrid.setNull": "Nastavit NULL", + "command.datagrid.undo": "Krok zpět", + "command.datagrid.viewJsonDocument": "Zobrazit řádek jako JSON dokument", + "command.datagrid.viewJsonValue": "Zobrazit buňku jako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáze", + "command.new.sqliteDatabase": "Nová SQLite databáze", + "command.tabs.addToFavorites": "Přidat aktuální kartu do oblíbených", + "command.tabs.closeAll": "Zavřít všechny karty", + "command.tabs.closeTab": "Zavřít kartu", + "command.tabs.closeTabsButCurrentDb": "Zavřít karty kromě aktuální DB", + "command.tabs.closeTabsWithCurrentDb": "Zavřít karty s aktuální DB", + "command.tabs.nextTab": "Další karta", + "command.tabs.previousTab": "Předchozí karta", + "command.tabs.reopenClosedTab": "Znovu otevřít zavřenou kartu", + "common.archive": "Archivovat (JSONL)", + "common.close": "Zavřít", + "common.connections": "Připojení", + "common.database": "Databáze", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Ukončit", + "common.query": "Dotaz", + "common.refresh": "Obnovit", + "common.save": "Uložit", + "common.saveToArchive": "Uložit do archívu", + "common.schema": "Schéma", + "connection.connect": "Připojit", + "connection.createDatabase": "Vytvořit databázi", + "connection.databaseName": "Název databáze", + "connection.delete": "Odstranit", + "connection.disconnect": "Odpojit", + "connection.duplicate": "Duplikovat", + "connection.edit": "Upravit", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnovit", + "connection.serverSummary": "Shrnutí serveru", + "connection.viewDetails": "Zobrazit detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnat", + "database.copyDatabaseName": "Kopírovat název databáze", + "database.createDatabaseBackup": "Vytvořit zálohu databáze", + "database.createNewApplication": "Vytvořit novou aplikaci", + "database.dataDeployer": "Nasazovač dat", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektivního dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojit", + "database.dropDatabase": "Odstranit databázi", + "database.editApplications": "Upravit aplikaci", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Vygenerovat skript", + "database.import": "Import", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabulka", + "database.perspective": "Perspektiva #", + "database.profiler": "Profiler", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnovit schémata", + "database.restore": "Obnovit #", + "database.restoreDatabaseBackup": "Obnovit zálohu databáze", + "database.shellDropAllObjects": "Shell: Odstranit všechny objekty", + "database.shellRunScript": "Shell: Spustit skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobrazit diagram", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné připojení k databázi, ovladač nebyl nalezen", + "error.selectedCloudConnection": "Vybrané připojení je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané připojení není z DbGate cloudu", + "file.allSupported": "Všechny podporované soubory", + "file.diagramFiles": "Soubory diagramů", + "file.duckdb": "Databáze DuckDB", + "file.jsonFiles": "Soubory JSON", + "file.perspectiveFiles": "Soubory perspektivy", + "file.queryDesignerFiles": "Soubory návrháře dotazů", + "file.sqlFiles": "Soubory SQL", + "file.sqliteDatabase": "Databáze SQLite", + "importExport.createZipFileInArchive": "Vytvořit ZIP soubor v archivu", + "importExport.exportToZipArchive": "Exportovat do ZIP archivu", + "importExport.exportToZipFile": "Exportovat do ZIP souboru", + "importExport.importFromZipArchive": "Importovat z ZIP archivu", + "importExport.importFromZipFile": "Importovat z ZIP souboru (v archivní složce)", + "importExport.sourceFiles": "Zdrojové soubory", + "importExport.tablesViewsCollections": "Tabulky / pohledy / kolekce", + "schema.add": "Přidat nové schéma", + "schema.createSchema": "Vytvořit schéma", + "schema.delete": "Odstranit schéma", + "schema.resetToDefault": "Resetovat na výchozí", + "schema.schemaName": "Název schématu", + "serverSummaryTab.databases": "Databáze", + "serverSummaryTab.errorTitle": "Chyba při načítání shrnutí serveru", + "serverSummaryTab.loadingMessage": "Načítání detailů serveru", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Proměnné", + "settings.appearance": "Vzhled aplikace", + "settings.appearance.customSize": "Vlastní velikost", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použít výchozí téma)", + "settings.appearance.fontFamily": "Písmo editoru", + "settings.appearance.fontSize": "Velikost fontu", + "settings.appearance.moreThemes": "Více témat je k dispozici jako", + "settings.appearance.useSystemTheme": "Použít systémové téma", + "settings.behaviour": "Chování", + "settings.behaviour.jsonPreviewWrap": "Zalomit JSON v náhledu", + "settings.behaviour.openDetailOnArrows": "Otevřít detail při navigaci klávesnicí", + "settings.behaviour.useTabPreviewMode": "Použít režim náhledu na kartě", + "settings.confirmations": "Potvrzení", + "settings.confirmations.skipConfirm.collectionDataSave": "Přeskočit potvrzení při ukládání údajů kolekce (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Přeskočit potvrzení při ukládání údajů tabulky (SQL)", + "settings.connection": "Připojení", + "settings.connection.autoRefresh": "Automatické obnovení modelu databáze na pozadí", + "settings.connection.autoRefreshInterval": "Interval mezi automatickým načítáním struktury DB v sekundách", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobrazit pouze karty z vybrané databáze", + "settings.connection.sshBindHost": "Adresa localhostu pro SSH připojení", + "settings.dataGrid.alignNumbersRight": "Zarovnat čísla doprava", + "settings.dataGrid.collectionPageSize": "Velikost stránky kolekce (pro MongoDB JSON zobrazení, musí být mezi 5 a 50000)", + "settings.dataGrid.coloringMode": "Režim zabarvení řádků", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. řádek, primární barva", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. řádek, sekundární barva", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. řádek", + "settings.dataGrid.coloringMode.none": "Žádný", + "settings.dataGrid.defaultAutoRefreshInterval": "Výchozí interval automatického obnovení mřížky (v sekundách)", + "settings.dataGrid.pageSize": "Velikost stránky (počet řádků pro inkrementální načítání, musí být mezi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobrazit všechny sloupce při hledání", + "settings.dataGrid.showHintColumns": "Zobrazit nápovědu pro cizí klíče", + "settings.dataGrid.thousandsSeparator": "Použít oddělovač tisíců pro čísla", + "settings.dataGrid.title": "Mřížka dat", + "settings.defaultActions": "Výchozí akce", + "settings.defaultActions.collectionClick": "Kliknutí na kolekci", + "settings.defaultActions.connectionClick": "Kliknutí na připojení", + "settings.defaultActions.connectionClick.connect": "Připojit", + "settings.defaultActions.connectionClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.connectionClick.openDetails": "Upravit / otevřít detaily", + "settings.defaultActions.databaseClick": "Kliknutí na databázi", + "settings.defaultActions.databaseClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.databaseClick.switch": "Přepnout databázi", + "settings.defaultActions.functionClick": "Kliknutí na funkci", + "settings.defaultActions.materializedViewClick": "Kliknutí na materializovaný pohled", + "settings.defaultActions.procedureClick": "Kliknutí na proceduru", + "settings.defaultActions.tableClick": "Kliknutí na tabulku", + "settings.defaultActions.useLastUsedAction": "Použít naposledy použitou akci", + "settings.defaultActions.viewClick": "Kliknutí na pohled", + "settings.editor.keybinds": "Klávesové zkratky editoru", + "settings.editor.wordWrap": "Povolit zalamování textu", + "settings.externalTools": "Externí nástroje", + "settings.general": "Obecné", + "settings.license": "Licence", + "settings.localization": "Lokalizace", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikace bude restartována, aby se změnil jazyk", + "settings.nativeMenuRestartWarning": "Nastavení nativního menu budou aplikována po restartu aplikace", + "settings.other": "Ostatní", + "settings.other.ai.allowSendModels": "Povolit odesílání DB modelů a dotazových fragmentů do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovat aplikaci", + "settings.other.autoUpdateApplication.check": "Zkontrolovat dostupnost nových verzí", + "settings.other.autoUpdateApplication.download": "Zkontrolovat a stáhnout nové verze", + "settings.other.autoUpdateApplication.skip": "Nekontrolovat nové verze", + "settings.other.externalTools.mysql": "mysql (obnovení databáze MySQL)", + "settings.other.externalTools.mysqlPlugins": "Složka s MySQL pluginy (například pro autentizaci). Nastavit pouze v případě problémů", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databáze MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databáze PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovení databáze PostgreSQL)", + "settings.other.gistCreateToken": "API token pro vytváření chybových gistů", + "settings.other.license": "Licence", + "settings.other.licenseKey": "Licenční klíč", + "settings.other.licenseKey.checkForNew": "Ověřit nový licenční klíč", + "settings.other.licenseKey.expiration": "Expirace licenčního klíče:", + "settings.other.licenseKey.invalid": "Licenční klíč je neplatný", + "settings.other.licenseKey.valid": "Licenční klíč je platný", + "settings.other.licenseKey.validTo": "Licence platná do:", + "settings.session": "Dotazové relace", + "settings.session.autoClose": "Automatické uzavření dotazových relací po období nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po kterém je dotazová relace bez aktivity uzavřena (v minutách)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázat vykonání aktuálního řádku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázat rozdělení podle prázdného řádku", + "settings.sqlEditor.limitRows": "Vrátit pouze N řádků při spuštění dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobrazit aliasy tabulek v dokončování kódu", + "settings.sqlEditor.sqlCommandsCase": "Velikost písmen SQL příkazů", + "settings.tabGroup.showServerName": "Zobrazit název serveru vedle názvu databáze v záhlaví skupiny karet", + "settings.theme": "Vzhled", + "settings.title": "Nastavení", + "summaryProcesses.actions": "Akce", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID připojení", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operace", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas běhu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čeká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Proměnná", + "tab.administration": "Administrace", + "widget.databaseContent": "Obsah databáze", + "widget.databases": "Databáze", + "widget.keys": "Klíče", + "widget.pinned": "Připnuté", + "widget.tablesViewsFunctions": "Tabulky, pohledy, funkce" +} \ No newline at end of file diff --git a/translations/en.json b/translations/en.json index 3eadc7994..d232d8fcd 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1,7 +1,11 @@ { + "app.databaseName": "Database name", "app.preparingPlugins": "Preparing plugins ...", "app.starting": "Starting DbGate", "authToken": "Auth token", + "column.copyName": "Copy name", + "column.dropColumn": "Drop column", + "column.renameColumn": "Rename column", "command.datagrid.addNewColumn": "Add new column", "command.datagrid.addNewColumn.toolbar": "New column", "command.datagrid.cloneRows": "Clone rows", @@ -27,9 +31,7 @@ "command.datagrid.viewJsonDocument": "View row as JSON document", "command.datagrid.viewJsonValue": "View cell as JSON document", "command.new.duckdbDatabase": "New DuckDB database", - "command.new.duckdbDatabase.header": "Create DuckDB database", "command.new.sqliteDatabase": "New SQLite database", - "command.new.sqliteDatabase.header": "Create SQLite database", "command.tabs.addToFavorites": "Add current tab to favorites", "command.tabs.closeAll": "Close all tabs", "command.tabs.closeTab": "Close tab", @@ -38,12 +40,17 @@ "command.tabs.nextTab": "Next tab", "command.tabs.previousTab": "Previous tab", "command.tabs.reopenClosedTab": "Reopen closed tab", - "common.archive": "Archive", + "common.archive": "Archive (JSONL)", + "common.close": "Close", "common.connections": "Connections", "common.database": "Database", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Kill", "common.query": "Query", "common.refresh": "Refresh", "common.save": "Save", + "common.saveToArchive": "Save to archive", "common.schema": "Schema", "connection.connect": "Connect", "connection.createDatabase": "Create database", @@ -56,7 +63,53 @@ "connection.refresh": "Refresh", "connection.serverSummary": "Server summary", "connection.viewDetails": "View details", + "database.backup": "Backup #", + "database.compare": "Compare", + "database.copyDatabaseName": "Copy database name", + "database.createDatabaseBackup": "Create database backup", + "database.createNewApplication": "Create new application", + "database.dataDeployer": "Data deployer", + "database.databaseChat": "Database chat", + "database.databaseProfiler": "Database profiler", + "database.designPerspectiveQuery": "Design perspective query", + "database.designQuery": "Design query", + "database.diagram": "Diagram #", + "database.disconnect": "Disconnect", + "database.dropDatabase": "Drop database", + "database.editApplications": "Edit application", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Generate script", + "database.import": "Import", + "database.newQuery": "New query", + "database.newTable": "New table", + "database.perspective": "Perspective #", + "database.profiler": "Profiler", + "database.queryDesigner": "Query #", + "database.refreshSchemas": "Refresh schemas", + "database.restore": "Restore #", + "database.restoreDatabaseBackup": "Restore database backup", + "database.shellDropAllObjects": "Shell: Drop all objects", + "database.shellRunScript": "Shell: Run script", + "database.shellTitle": "Shell #", + "database.showDiagram": "Show diagram", + "database.sqlGenerator": "SQL Generator", "error.driverNotFound": "Invalid database connection, driver not found", + "error.selectedCloudConnection": "Selected connection is from DbGate cloud", + "error.selectedNotCloudConnection": "Selected connection is not from DbGate cloud", + "file.allSupported": "All supported files", + "file.diagramFiles": "Diagram files", + "file.duckdb": "DuckDB database", + "file.jsonFiles": "JSON files", + "file.perspectiveFiles": "Perspective files", + "file.queryDesignerFiles": "Query designer files", + "file.sqlFiles": "SQL files", + "file.sqliteDatabase": "SQLite database", + "importExport.createZipFileInArchive": "Create ZIP file in archive", + "importExport.exportToZipArchive": "Output ZIP archive", + "importExport.exportToZipFile": "Export to ZIP file", + "importExport.importFromZipArchive": "Input ZIP archive", + "importExport.importFromZipFile": "Import from ZIP file (in archive folder)", "importExport.sourceFiles": "Source files", "importExport.tablesViewsCollections": "Tables / views / collections", "schema.add": "Add new schema", @@ -64,8 +117,111 @@ "schema.delete": "Delete schema", "schema.resetToDefault": "Reset to default", "schema.schemaName": "Schema name", - "settings.behaviour.jsonPreviewWrap": "Wrap json in preview", + "serverSummaryTab.databases": "Databases", + "serverSummaryTab.errorTitle": "Error loading server summary", + "serverSummaryTab.loadingMessage": "Loading server details", + "serverSummaryTab.processes": "Processes", + "serverSummaryTab.variables": "Variables", + "settings.appearance": "Application theme", + "settings.appearance.customSize": "Custom size", + "settings.appearance.editorTheme": "Theme", + "settings.appearance.editorTheme.default": "(use theme default)", + "settings.appearance.fontFamily": "Editor font family", + "settings.appearance.fontSize": "Font size", + "settings.appearance.moreThemes": "More themes are available as", + "settings.appearance.useSystemTheme": "Use system theme", + "settings.behaviour": "Behaviour", + "settings.behaviour.jsonPreviewWrap": "Wrap JSON in preview", + "settings.behaviour.openDetailOnArrows": "Open detail on keyboard navigation", + "settings.behaviour.useTabPreviewMode": "Use tab preview mode", + "settings.confirmations": "Confirmations", + "settings.confirmations.skipConfirm.collectionDataSave": "Skip confirmation when saving collection data (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Skip confirmation when saving table data (SQL)", + "settings.connection": "Connection", + "settings.connection.autoRefresh": "Automatic refresh of database model on background", + "settings.connection.autoRefreshInterval": "Interval between automatic DB structure reloads in seconds", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Show only tabs from selected database", + "settings.connection.sshBindHost": "Local host address for SSH connections", + "settings.dataGrid.alignNumbersRight": "Align numbers to right", + "settings.dataGrid.collectionPageSize": "Collection page size (for MongoDB JSON view, must be between 5 and 1000)", + "settings.dataGrid.coloringMode": "Row coloring mode", + "settings.dataGrid.coloringMode.2-primary": "Every 2-nd row, primary color", + "settings.dataGrid.coloringMode.2-secondary": "Every 2-nd row, secondary color", + "settings.dataGrid.coloringMode.36": "Every 3rd and 6th row", + "settings.dataGrid.coloringMode.none": "None", + "settings.dataGrid.defaultAutoRefreshInterval": "Default grid auto refresh interval in seconds", + "settings.dataGrid.pageSize": "Page size (number of rows for incremental loading, must be between 5 and 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Show all columns when searching", + "settings.dataGrid.showHintColumns": "Show foreign key hints", + "settings.dataGrid.thousandsSeparator": "Use thousands separator for numbers", + "settings.dataGrid.title": "Data grid", + "settings.defaultActions": "Default actions", + "settings.defaultActions.collectionClick": "NoSQL collection click", + "settings.defaultActions.connectionClick": "Connection click", + "settings.defaultActions.connectionClick.connect": "Connect", + "settings.defaultActions.connectionClick.none": "Do nothing", + "settings.defaultActions.connectionClick.openDetails": "Edit / open details", + "settings.defaultActions.databaseClick": "Database click", + "settings.defaultActions.databaseClick.none": "Do nothing", + "settings.defaultActions.databaseClick.switch": "Switch database", + "settings.defaultActions.functionClick": "Function click", + "settings.defaultActions.materializedViewClick": "Materialized view click", + "settings.defaultActions.procedureClick": "Procedure click", + "settings.defaultActions.tableClick": "Table click", + "settings.defaultActions.useLastUsedAction": "Use last used action", + "settings.defaultActions.viewClick": "View click", + "settings.editor.keybinds": "Editor keybinds", + "settings.editor.wordWrap": "Enable word wrap", + "settings.externalTools": "External tools", + "settings.general": "General", + "settings.license": "License", "settings.localization": "Localization", + "settings.localization.language": "Language", + "settings.localization.reloadWarning": "Application will be reloaded to apply new language settings", + "settings.nativeMenuRestartWarning": "Native menu settings will be applied after app restart", + "settings.other": "Other", + "settings.other.ai.allowSendModels": "Allow to send DB models and query snippets to AI service", + "settings.other.autoUpdateApplication": "Auto update application", + "settings.other.autoUpdateApplication.check": "Check for new versions", + "settings.other.autoUpdateApplication.download": "Check and download new versions", + "settings.other.autoUpdateApplication.skip": "Do not check for new versions", + "settings.other.externalTools.mysql": "mysql (restore MySQL database)", + "settings.other.externalTools.mysqlPlugins": "Folder with mysql plugins (for example for authentication). Set only in case of problems", + "settings.other.externalTools.mysqldump": "mysqldump (backup MySQL database)", + "settings.other.externalTools.pg_dump": "pg_dump (backup PostgreSQL database)", + "settings.other.externalTools.psql": "psql (restore PostgreSQL database)", + "settings.other.gistCreateToken": "API token for creating error gists", + "settings.other.license": "License", + "settings.other.licenseKey": "License key", + "settings.other.licenseKey.checkForNew": "Check for new license key", + "settings.other.licenseKey.expiration": "License key expiration:", + "settings.other.licenseKey.invalid": "License key is invalid", + "settings.other.licenseKey.valid": "License key is valid", + "settings.other.licenseKey.validTo": "License valid to:", + "settings.session": "Query sessions", + "settings.session.autoClose": "Automatic close query sessions after period without any activity", + "settings.session.autoCloseTimeout": "Interval, after which query session without activity is closed (in minutes)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Disable current line execution (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Disable split by empty line", + "settings.sqlEditor.limitRows": "Return only N rows from query", + "settings.sqlEditor.limitRowsPlaceholder": "(No rows limit)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Show table aliases in code completion", + "settings.sqlEditor.sqlCommandsCase": "SQL commands case", + "settings.tabGroup.showServerName": "Show server name alongside database name in title of the tab group", + "settings.theme": "Themes", + "settings.title": "Settings", + "summaryProcesses.actions": "Actions", + "summaryProcesses.client": "Client", + "summaryProcesses.connectionId": "Connection ID", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operation", + "summaryProcesses.processId": "Process ID", + "summaryProcesses.runningTime": "Running Time", + "summaryProcesses.state": "State", + "summaryProcesses.waitingFor": "Waiting For", + "summaryVariables.value": "Value", + "summaryVariables.variable": "Variable", "tab.administration": "Administration", "widget.databaseContent": "Database content", "widget.databases": "Databases", diff --git a/translations/sk.json b/translations/sk.json new file mode 100644 index 000000000..094b13546 --- /dev/null +++ b/translations/sk.json @@ -0,0 +1,231 @@ +{ + "app.databaseName": "Názov databázy", + "app.preparingPlugins": "Príprava pluginov...", + "app.starting": "Spúšťam DbGate", + "authToken": "Autentifikačný token", + "column.copyName": "Kopírovať názov", + "column.dropColumn": "Odstrániť stĺpec", + "column.renameColumn": "Premenovať stĺpec", + "command.datagrid.addNewColumn": "Pridať nový stĺpec", + "command.datagrid.addNewColumn.toolbar": "Nový stĺpec", + "command.datagrid.cloneRows": "Klonovať riadky", + "command.datagrid.cloneRows.toolbar": "Klonovať riadok(y)", + "command.datagrid.copyToClipboard": "Kopírovať do schránky", + "command.datagrid.deleteSelectedRows": "Odstrániť vybrané riadky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstrániť riadok(y)", + "command.datagrid.editJsonDocument": "Upraviť riadok ako JSON dokument", + "command.datagrid.insertNewRow": "Vložiť nový riadok", + "command.datagrid.insertNewRow.toolbar": "Nový riadok", + "command.datagrid.loadCellFromFile": "Načítať bunku zo súboru", + "command.datagrid.openJsonArrayInSheet": "Otvoriť pole ako tabuľku", + "command.datagrid.openSelectionInMap": "Otvoriť výber v mape", + "command.datagrid.reconnect": "Znovu pripojiť", + "command.datagrid.redo": "Znova", + "command.datagrid.removeField": "Odstrániť pole", + "command.datagrid.revertAllChanges": "Vrátiť všetky zmeny", + "command.datagrid.revertAllChanges.toolbar": "Vrátiť všetko", + "command.datagrid.revertRowChanges": "Vrátiť zmeny riadka", + "command.datagrid.saveCellToFile": "Uložiť bunku do súboru", + "command.datagrid.setNull": "Nastaviť NULL", + "command.datagrid.undo": "Krok späť", + "command.datagrid.viewJsonDocument": "Zobraziť riadok ako JSON dokument", + "command.datagrid.viewJsonValue": "Zobraziť bunku ako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáza", + "command.new.sqliteDatabase": "Nová SQLite databáza", + "command.tabs.addToFavorites": "Pridať aktuálnu kartu do obľúbených", + "command.tabs.closeAll": "Zavrieť všetky karty", + "command.tabs.closeTab": "Zavrieť kartu", + "command.tabs.closeTabsButCurrentDb": "Zavrieť karty okrem aktuálnej DB", + "command.tabs.closeTabsWithCurrentDb": "Zavrieť karty s aktuálnou DB", + "command.tabs.nextTab": "Ďalšia karta", + "command.tabs.previousTab": "Predchádzajúca karta", + "command.tabs.reopenClosedTab": "Znovu otvoriť zatvorenú kartu", + "common.archive": "Archivovať (JSONL)", + "common.close": "Zavrieť", + "common.connections": "Pripojenia", + "common.database": "Databáza", + "common.export": "Exportovať", + "common.import": "Importovať", + "common.kill": "Ukončiť", + "common.query": "Dotaz", + "common.refresh": "Obnoviť", + "common.save": "Uložiť", + "common.saveToArchive": "Uložiť do archívu", + "common.schema": "Schéma", + "connection.connect": "Pripojiť", + "connection.createDatabase": "Vytvoriť databázu", + "connection.databaseName": "Názov databázy", + "connection.delete": "Odstrániť", + "connection.disconnect": "Odpojiť", + "connection.duplicate": "Duplikovať", + "connection.edit": "Upraviť", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnoviť", + "connection.serverSummary": "Zhrnutie servera", + "connection.viewDetails": "Zobraziť detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnať", + "database.copyDatabaseName": "Kopírovať názov databázy", + "database.createDatabaseBackup": "Vytvoriť zálohu databázy", + "database.createNewApplication": "Vytvoriť novú aplikáciu", + "database.dataDeployer": "Nasadzovač dát", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektívneho dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojiť", + "database.dropDatabase": "Odstrániť databázu", + "database.editApplications": "Upraviť aplikáciu", + "database.export": "Exportovať", + "database.exportDbModel": "Exportovať DB model", + "database.generateScript": "Generovať skript", + "database.import": "Importovať", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabuľka", + "database.perspective": "Perspektíva #", + "database.profiler": "Profilovač", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnoviť schémy", + "database.restore": "Obnoviť #", + "database.restoreDatabaseBackup": "Obnoviť zálohu databázy", + "database.shellDropAllObjects": "Shell: Odstrániť všetky objekty", + "database.shellRunScript": "Shell: Spustiť skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobraziť", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné pripojenie k databáze, ovládač nenájdený", + "error.selectedCloudConnection": "Vybrané pripojenie je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané pripojenie nie je z DbGate cloudu", + "file.allSupported": "Všetky podporované súbory", + "file.diagramFiles": "Súbory diagramov", + "file.duckdb": "Databáza DuckDB", + "file.jsonFiles": "JSON súbory", + "file.perspectiveFiles": "Súbory perspektívy", + "file.queryDesignerFiles": "Súbory návrhu dotazu", + "file.sqlFiles": "SQL súbory", + "file.sqliteDatabase": "SQLite databáza", + "importExport.createZipFileInArchive": "Vytvoriť ZIP súbor v archíve", + "importExport.exportToZipArchive": "Exportovať do ZIP archívu", + "importExport.exportToZipFile": "Exportovať do ZIP súboru", + "importExport.importFromZipArchive": "Importovať zo ZIP archívu", + "importExport.importFromZipFile": "Importovať zo ZIP súboru (v archívnej zložke)", + "importExport.sourceFiles": "Zdrojové súbory", + "importExport.tablesViewsCollections": "Tabuľky / pohľady / kolekcie", + "schema.add": "Pridať novú schému", + "schema.createSchema": "Vytvoriť schému", + "schema.delete": "Odstrániť schému", + "schema.resetToDefault": "Resetovať na predvolené", + "schema.schemaName": "Názov schémy", + "serverSummaryTab.databases": "Databázy", + "serverSummaryTab.errorTitle": "Chyba pri načítaní zhrnutia servera", + "serverSummaryTab.loadingMessage": "Načítavanie detailov servera", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Premenné", + "settings.appearance": "Vzhľad aplikácie", + "settings.appearance.customSize": "Vlastná veľkosť", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použiť predvolenú tému)", + "settings.appearance.fontFamily": "Písmo editora", + "settings.appearance.fontSize": "Veľkosť písma", + "settings.appearance.moreThemes": "Viac tém je k dispozícii ako", + "settings.appearance.useSystemTheme": "Použiť systémovú tému", + "settings.behaviour": "Správanie", + "settings.behaviour.jsonPreviewWrap": "Zalomiť JSON v náhľade", + "settings.behaviour.openDetailOnArrows": "Otvoriť detail pri navigácii klávesnicou", + "settings.behaviour.useTabPreviewMode": "Použiť režim náhľadu na karte", + "settings.confirmations": "Potvrdenia", + "settings.confirmations.skipConfirm.collectionDataSave": "Preskočiť potvrdenie pri ukladaní údajov kolekcie (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Preskočiť potvrdenie pri ukladaní údajov tabuľky (SQL)", + "settings.connection": "Pripojenie", + "settings.connection.autoRefresh": "Automatické obnovenie modelu databázy na pozadí", + "settings.connection.autoRefreshInterval": "Interval medzi automatickým načítaním štruktúry DB (v sekundách)", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobraziť iba karty z vybranej databázy", + "settings.connection.sshBindHost": "Adresa localhostu pre SSH pripojenia", + "settings.dataGrid.alignNumbersRight": "Zarovnať čísla doprava", + "settings.dataGrid.collectionPageSize": "Veľkosť stránky kolekcie (pre JSON zobrazenie MongoDB, musí byť medzi 5 a 1000)", + "settings.dataGrid.coloringMode": "Režim farbenia riadkov", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. riadok, primárna farba", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. riadok, sekundárna farba", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. riadok", + "settings.dataGrid.coloringMode.none": "Žiadne", + "settings.dataGrid.defaultAutoRefreshInterval": "Predvolený interval automatického obnovenia mriežky v sekundách", + "settings.dataGrid.pageSize": "Veľkosť stránky (počet riadkov pre inkrementálne načítanie, musí byť medzi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobraziť všetky stĺpce pri vyhľadávaní", + "settings.dataGrid.showHintColumns": "Zobraziť nápovedy pre cudzie kľúče", + "settings.dataGrid.thousandsSeparator": "Použiť oddeľovač tisícov pre čísla", + "settings.dataGrid.title": "Mriežka údajov", + "settings.defaultActions": "Predvolené akcie", + "settings.defaultActions.collectionClick": "Kliknutie na kolekciu NoSQL", + "settings.defaultActions.connectionClick": "Kliknutie na pripojenie", + "settings.defaultActions.connectionClick.connect": "Pripojiť", + "settings.defaultActions.connectionClick.none": "Nevykonať nič", + "settings.defaultActions.connectionClick.openDetails": "Upraviť / otvoriť detaily", + "settings.defaultActions.databaseClick": "Kliknutie na databázu", + "settings.defaultActions.databaseClick.none": "Nevykonať nič", + "settings.defaultActions.databaseClick.switch": "Prepnúť databázu", + "settings.defaultActions.functionClick": "Kliknutie na funkciu", + "settings.defaultActions.materializedViewClick": "Kliknutie na materializovaný pohľad", + "settings.defaultActions.procedureClick": "Kliknutie na procedúru", + "settings.defaultActions.tableClick": "Kliknutie na tabuľku", + "settings.defaultActions.useLastUsedAction": "Použiť naposledy použitú akciu", + "settings.defaultActions.viewClick": "Kliknutie na pohľad", + "settings.editor.keybinds": "Klávesové skratky editora", + "settings.editor.wordWrap": "Povoliť zalomovanie riadkov", + "settings.externalTools": "Externé nástroje", + "settings.general": "Všeobecné", + "settings.license": "Licencia", + "settings.localization": "Lokalizácia", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikácia musí byť reštartovaná, aby sa zmenil jazyk", + "settings.nativeMenuRestartWarning": "Nastavenie natívnej ponuky vyžaduje reštart aplikácie", + "settings.other": "Ostatné", + "settings.other.ai.allowSendModels": "Povoliť odosielanie modelov DB a fragmentov dotazov do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovať aplikáciu", + "settings.other.autoUpdateApplication.check": "Skontrolovať nové verzie", + "settings.other.autoUpdateApplication.download": "Skontrolovať a stiahnuť nové verzie", + "settings.other.autoUpdateApplication.skip": "Nekontrolovať nové verzie", + "settings.other.externalTools.mysql": "mysql (obnovenie databázy MySQL)", + "settings.other.externalTools.mysqlPlugins": "Priečinok s pluginmi MySQL (napríklad pre autentifikáciu). Nastaviť iba v prípade problémov", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databázy MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databázy PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovenie databázy PostgreSQL)", + "settings.other.gistCreateToken": "API token pre vytváranie chybových gistov", + "settings.other.license": "Licencia", + "settings.other.licenseKey": "Licenčný kľúč", + "settings.other.licenseKey.checkForNew": "Overiť nový licenčný kľúč", + "settings.other.licenseKey.expiration": "Expirácia licencie:", + "settings.other.licenseKey.invalid": "Licenčný kľúč je neplatný", + "settings.other.licenseKey.valid": "Licenčný kľúč je platný", + "settings.other.licenseKey.validTo": "Licencia platná do:", + "settings.session": "Dotazové relácie", + "settings.session.autoClose": "Automaticky zatvoriť relácie dotazov po čase nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po ktorom sa relácia dotazov bez aktivity zatvorí (v minútach)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázať vykonanie aktuálneho riadku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázať rozdelenie prázdnym riadkom", + "settings.sqlEditor.limitRows": "Vrátiť iba N riadkov z dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobraziť aliasy tabuliek v automatickom doplňovaní", + "settings.sqlEditor.sqlCommandsCase": "Veľkosť písmen", + "settings.tabGroup.showServerName": "Zobraziť názov servera vedľa názvu databázy v názve skupiny kariet", + "settings.theme": "Vzhľad", + "settings.title": "Nastavenia", + "summaryProcesses.actions": "Akcie", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID pripojenia", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operácia", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas behu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čaká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Premenná", + "tab.administration": "Administrácia", + "widget.databaseContent": "Obsah databázy", + "widget.databases": "Databázy", + "widget.keys": "Kľúče", + "widget.pinned": "Pripnuté", + "widget.tablesViewsFunctions": "Tabuľky, pohľady, funkcie" +} \ No newline at end of file From 64c2faf5384a70214cc6f20603a337e2b920a09d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:10:45 +0100 Subject: [PATCH 007/124] JSON UI --- packages/api/src/controllers/cloud.js | 12 +++ packages/api/src/utility/cloudIntf.js | 12 +++ packages/web/public/icon-colors.css | 5 ++ packages/web/src/commands/stdCommands.ts | 37 ++++++++++ .../src/jsonui/JsonUiContentRenderer.svelte | 9 ++- .../web/src/jsonui/JsonUiCountdown.svelte | 73 +++++++++++++++++++ .../web/src/jsonui/JsonUiHighlight.svelte | 19 +++++ packages/web/src/jsonui/JsonUiMarkdown.svelte | 15 ++++ packages/web/src/stores.ts | 3 + .../widgets/AdminPremiumPromoWidget.svelte | 7 +- .../web/src/widgets/WidgetIconPanel.svelte | 9 ++- 11 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 packages/web/src/jsonui/JsonUiCountdown.svelte create mode 100644 packages/web/src/jsonui/JsonUiHighlight.svelte create mode 100644 packages/web/src/jsonui/JsonUiMarkdown.svelte diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index 407eafcad..ad348b1f7 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -9,6 +9,8 @@ const { putCloudContent, removeCloudCachedConnection, getPromoWidgetData, + getPromoWidgetList, + getPromoWidgetPreview, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -296,6 +298,16 @@ module.exports = { return data; }, + promoWidgetList_meta: true, + async promoWidgetList() { + return getPromoWidgetList(); + }, + + promoWidgetPreview_meta: true, + async promoWidgetPreview({ campaign, variant }) { + return getPromoWidgetPreview(campaign, variant); + }, + // chatStream_meta: { // raw: true, // method: 'post', diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index b27880689..b0ea4217a 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -480,6 +480,16 @@ async function getPromoWidgetData() { return promoWidgetData; } +async function getPromoWidgetPreview(campaign, variant) { + const resp = await axios.default.get(`${DBGATE_CLOUD_URL}/premium-promo-widget-preview/${campaign}/${variant}`); + return resp.data; +} + +async function getPromoWidgetList() { + const resp = await axios.default.get(`${DBGATE_CLOUD_URL}/promo-widget-list`); + return resp.data; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -498,4 +508,6 @@ module.exports = { readCloudTestTokenHolder, getPublicIpInfo, getPromoWidgetData, + getPromoWidgetPreview, + getPromoWidgetList, }; diff --git a/packages/web/public/icon-colors.css b/packages/web/public/icon-colors.css index 0e904452d..25cad9a76 100644 --- a/packages/web/public/icon-colors.css +++ b/packages/web/public/icon-colors.css @@ -35,6 +35,11 @@ background: linear-gradient(135deg, #1686c8, #8a25b1); } +.premium-gradient { + background: linear-gradient(135deg, #1686c8, #8a25b1); + color: white; +} + .web-color-primary { background: #1686c8; } diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index cbf82fc72..f2f3872d6 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -8,6 +8,7 @@ import { getCloudSigninTokenHolder, getExtensions, getVisibleToolbar, + promoWidgetPreview, visibleToolbar, visibleWidgetSideBar, } from '../stores'; @@ -50,6 +51,7 @@ import { isProApp } from '../utility/proTools'; import { openWebLink } from '../utility/simpleTools'; import { _t } from '../translations'; import ExportImportConnectionsModal from '../modals/ExportImportConnectionsModal.svelte'; +import { getBoolSettingsValue } from '../settings/settingsTools'; // function themeCommand(theme: ThemeDefinition) { // return { @@ -1164,6 +1166,41 @@ registerCommand({ onClick: () => currentDatabase.set(null), }); +let loadedCampaignList = []; + +registerCommand({ + id: 'internal.loadCampaigns', + category: 'Internal', + name: 'Load campaign list', + testEnabled: () => getBoolSettingsValue('internal.showCampaigns', false), + onClick: async () => { + const resp = await apiCall('cloud/promo-widget-list', {}); + loadedCampaignList = resp; + }, +}); + +registerCommand({ + id: 'internal.showCampaigns', + category: 'Internal', + name: 'Show campaigns', + testEnabled: () => getBoolSettingsValue('internal.showCampaigns', false) && loadedCampaignList?.length > 0, + getSubCommands: () => { + return loadedCampaignList.map(campaign => ({ + text: `${campaign.campaignName} (${campaign.countries || 'Global'}) - #${campaign.quantileRank ?? '*'}/${ + campaign.quantileGroupCount ?? '*' + } - ${campaign.variantIdentifier}`, + onClick: async () => { + promoWidgetPreview.set( + await apiCall('cloud/promo-widget-preview', { + campaign: campaign.campaignIdentifier, + variant: campaign.variantIdentifier, + }) + ); + }, + })); + }, +}); + const electron = getElectron(); if (electron) { electron.addEventListener('run-command', (e, commandId) => runCommand(commandId)); diff --git a/packages/web/src/jsonui/JsonUiContentRenderer.svelte b/packages/web/src/jsonui/JsonUiContentRenderer.svelte index b1562d16d..07fdcb667 100644 --- a/packages/web/src/jsonui/JsonUiContentRenderer.svelte +++ b/packages/web/src/jsonui/JsonUiContentRenderer.svelte @@ -1,22 +1,29 @@ {#each blocks as block, i} {#if block.type in componentMap} - + {/if} {/each} diff --git a/packages/web/src/jsonui/JsonUiCountdown.svelte b/packages/web/src/jsonui/JsonUiCountdown.svelte new file mode 100644 index 000000000..c0e196f05 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiCountdown.svelte @@ -0,0 +1,73 @@ + + +{#if validTo} +
+ Offer ends in:
+ {#each parts as part} + + {part.num} + {part.unit} + + {/each} +
+{/if} + + diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte new file mode 100644 index 000000000..8437d7a84 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -0,0 +1,19 @@ + + +
+ {text} +
+ + diff --git a/packages/web/src/jsonui/JsonUiMarkdown.svelte b/packages/web/src/jsonui/JsonUiMarkdown.svelte new file mode 100644 index 000000000..cfe522772 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiMarkdown.svelte @@ -0,0 +1,15 @@ + + +
+ +
+ + diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index 6ab382f5e..d30046e99 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -187,6 +187,9 @@ export const seenPremiumPromoWidget = writableWithStorage(null, 'seenPremiumProm export const cloudConnectionsStore = writable({}); +export const promoWidgetPreview = writable(null); + + export const DEFAULT_OBJECT_SEARCH_SETTINGS = { pureName: true, schemaName: false, diff --git a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte index d3f80daed..ec3c9ea16 100644 --- a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte +++ b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte @@ -1,14 +1,17 @@ - {#if $promoWidget?.state == 'data'} - + {#if promoWidgetData?.state == 'data'} + {/if} diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 5f3c1ff06..052ca4a98 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -11,6 +11,7 @@ getCurrentConfig, cloudSigninTokenHolder, seenPremiumPromoWidget, + promoWidgetPreview, } from '../stores'; import mainMenuDefinition from '../../../../app/src/mainMenuDefinition'; import hasPermission from '../utility/hasPermission'; @@ -167,6 +168,8 @@ openWebLink(url, true); } } + + $: promoWidgetData = $promoWidgetPreview || $promoWidget;
@@ -177,7 +180,7 @@ {/if} {#each widgets .filter(x => x && hasPermission(`widgets/${x.name}`)) - .filter(x => !x.isPremiumPromo || (!isProApp() && $promoWidget?.state == 'data')) + .filter(x => !x.isPremiumPromo || (!isProApp() && promoWidgetData?.state == 'data')) // .filter(x => !x.isPremiumOnly || isProApp()) .filter(x => x.name != 'cloud-private' || $cloudSigninTokenHolder) as item}
handleChangeWidget(item.name)} > - {#if item.isPremiumPromo && $promoWidget?.isColoredIcon} + {#if item.isPremiumPromo && promoWidgetData?.isColoredIcon} Premium
- {#if $promoWidget?.identifier != $seenPremiumPromoWidget} + {#if promoWidgetData?.identifier != $seenPremiumPromoWidget}
{/if} {/if} From 28fecc683421d80d7ac2cafb178332561a1e9a17 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:18:55 +0100 Subject: [PATCH 008/124] v6.6.6-beta.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df09f2e42..4bf715acd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.13", + "version": "6.6.6-beta.14", "name": "dbgate-all", "workspaces": [ "packages/*", From 6e645cb054c519e755c699da31c8c43fe29bad6d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:11 +0100 Subject: [PATCH 009/124] v6.6.6-beta.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bf715acd..87354f37c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.14", + "version": "6.6.6-beta.7", "name": "dbgate-all", "workspaces": [ "packages/*", From 70c53248ae63b7ee17d027118d8bcf5b27d6f779 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:20 +0100 Subject: [PATCH 010/124] v6.6.6-beta.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87354f37c..ad56007ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.7", + "version": "6.6.6-beta.17", "name": "dbgate-all", "workspaces": [ "packages/*", From 4d6957a6fa56c457502a39fc86822bb4d7810c5d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:40 +0100 Subject: [PATCH 011/124] v6.6.6-premium-beta.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad56007ef..65fda0599 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.17", + "version": "6.6.6-premium-beta.18", "name": "dbgate-all", "workspaces": [ "packages/*", From 8429067ae5866c1e86c706eeebad9399675310c0 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 15:04:04 +0100 Subject: [PATCH 012/124] translation-connections,sqlObject,column,filter --- .../web/src/appobj/ConnectionAppObject.svelte | 2 +- packages/web/src/commands/stdCommands.ts | 4 +- .../web/src/datagrid/ColumnManager.svelte | 11 +- .../web/src/datagrid/DataFilterControl.svelte | 87 +++++----- packages/web/src/modals/InputTextModal.svelte | 3 +- packages/web/src/modals/SetFilterModal.svelte | 11 +- .../src/modals/SetFilterModal_Select.svelte | 43 ++--- .../ConnectionAdvancedDriverFields.svelte | 5 +- .../settings/ConnectionDriverFields.svelte | 84 +++++----- .../settings/ConnectionSshTunnelFields.svelte | 19 +-- .../src/settings/ConnectionSslFields.svelte | 13 +- .../web/src/widgets/ConnectionList.svelte | 23 +-- packages/web/src/widgets/SqlObjectList.svelte | 35 ++-- translations/cs.json | 149 +++++++++++++++++- translations/en.json | 149 +++++++++++++++++- translations/sk.json | 149 +++++++++++++++++- 16 files changed, 619 insertions(+), 168 deletions(-) diff --git a/packages/web/src/appobj/ConnectionAppObject.svelte b/packages/web/src/appobj/ConnectionAppObject.svelte index d99ccaf2a..afdaa91e5 100644 --- a/packages/web/src/appobj/ConnectionAppObject.svelte +++ b/packages/web/src/appobj/ConnectionAppObject.svelte @@ -279,7 +279,7 @@ showModal(InputTextModal, { header: _t('connection.createDatabase', { defaultMessage: 'Create database' }), value: 'newdb', - label: _t('connection.databaseName', { defaultMessage: 'Database name' }), + label: _t('connection.database', { defaultMessage: 'Database name' }), onConfirm: name => apiCall('server-connections/create-database', { conid: data._id, diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index cbf82fc72..dae6ec430 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -159,8 +159,8 @@ registerCommand({ onClick: () => { showModal(InputTextModal, { value: '', - label: 'New connection folder name', - header: 'Create connection folder', + label: _t('connection.createNewFolderName', { defaultMessage: 'New connection folder name' }), + header: _t('connection.createNewFolder', { defaultMessage: 'Create connection folder' }), onConfirm: async folder => { emptyConnectionGroupNames.update(names => { if (!folder) return names; diff --git a/packages/web/src/datagrid/ColumnManager.svelte b/packages/web/src/datagrid/ColumnManager.svelte index fbc024457..573df7ea9 100644 --- a/packages/web/src/datagrid/ColumnManager.svelte +++ b/packages/web/src/datagrid/ColumnManager.svelte @@ -17,6 +17,7 @@ import SelectField from '../forms/SelectField.svelte'; import ColumnEditorModal from '../tableeditor/ColumnEditorModal.svelte'; import { tick } from 'svelte'; + import { _t } from '../translations'; export let managerSize; export let display: GridDisplay; @@ -154,8 +155,8 @@ class="colmode" value={isDynamicStructure ? 'variable' : 'fixed'} options={[ - { label: 'Fixed columns (like SQL)', value: 'fixed' }, - { label: 'Variable columns (like MongoDB)', value: 'variable' }, + { label: _t('column.fixed', {defaultMessage: 'Fixed columns (like SQL)'}), value: 'fixed' }, + { label: _t('column.variable', {defaultMessage: 'Variable columns (like MongoDB)'}) , value: 'variable' }, ]} on:change={e => { dispatchChangeSet({ @@ -175,7 +176,7 @@ {/if} display.setSearchInColumns(value)} data-testid="ColumnManager_searchColumns" @@ -186,8 +187,8 @@ on:click={() => { showModal(InputTextModal, { value: '', - label: 'Column name', - header: 'Add new column', + label: _t('column.name', {defaultMessage: 'Column name'}), + header: _t('column.addNew', {defaultMessage: 'Add new column'}), onConfirm: name => { display.addDynamicColumn(name); tick().then(() => { diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 9508de601..7f2a5025a 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -17,6 +17,7 @@ import FontIcon from '../icons/FontIcon.svelte'; import DictionaryLookupModal from '../modals/DictionaryLookupModal.svelte'; import ValueLookupModal from '../modals/ValueLookupModal.svelte'; + import { _t } from '../translations'; export let isReadOnly = false; export let filterBehaviour; @@ -64,43 +65,43 @@ function createMenu() { const res = [ - { onClick: () => setFilter(''), text: 'Clear Filter' }, - { onClick: () => filterMultipleValues(), text: 'Filter multiple values' }, + { onClick: () => setFilter(''), text: _t('filter.clear', { defaultMessage: 'Clear Filter' }) }, + { onClick: () => filterMultipleValues(), text: _t('filter.multipleValues', { defaultMessage: 'Filter multiple values' }) }, ]; if (filterBehaviour.supportEquals) { res.push( - { onClick: () => openFilterWindow('='), text: 'Equals...' }, - { onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' } + { onClick: () => openFilterWindow('='), text: _t('filter.equals', { defaultMessage: 'Equals...' }) }, + { onClick: () => openFilterWindow('<>'), text: _t('filter.doesNotEqual', { defaultMessage: 'Does Not Equal...' }) } ); } if (filterBehaviour.supportExistsTesting) { res.push( - { onClick: () => setFilter('EXISTS'), text: 'Field exists' }, - { onClick: () => setFilter('NOT EXISTS'), text: 'Field does not exist' } + { onClick: () => setFilter('EXISTS'), text: _t('filter.fieldExists', { defaultMessage: 'Field exists' }) }, + { onClick: () => setFilter('NOT EXISTS'), text: _t('filter.fieldDoesNotExist', { defaultMessage: 'Field does not exist' }) } ); } if (filterBehaviour.supportNotEmptyArrayTesting) { - res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: 'Array is not empty' }); + res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: _t('filter.arrayIsNotEmpty', { defaultMessage: 'Array is not empty' }) }); } if (filterBehaviour.supportEmptyArrayTesting) { - res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: 'Array is empty' }); + res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: _t('filter.arrayIsEmpty', { defaultMessage: 'Array is empty' }) }); } if (filterBehaviour.supportNullTesting) { res.push( - { onClick: () => setFilter('NULL'), text: 'Is Null' }, - { onClick: () => setFilter('NOT NULL'), text: 'Is Not Null' } + { onClick: () => setFilter('NULL'), text: _t('filter.isNull', { defaultMessage: 'Is Null' }) }, + { onClick: () => setFilter('NOT NULL'), text: _t('filter.isNotNull', { defaultMessage: 'Is Not Null' }) } ); } if (filterBehaviour.supportEmpty) { res.push( - { onClick: () => setFilter('EMPTY, NULL'), text: 'Is Empty Or Null' }, - { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: 'Has Not Empty Value' } + { onClick: () => setFilter('EMPTY, NULL'), text: _t('filter.isEmptyOrNull', { defaultMessage: 'Is Empty Or Null' }) }, + { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: _t('filter.hasNotEmptyValue', { defaultMessage: 'Has Not Empty Value' }) } ); } @@ -108,10 +109,10 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('>'), text: 'Greater Than...' }, - { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, - { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, - { onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' } + { onClick: () => openFilterWindow('>'), text: _t('filter.greaterThan', { defaultMessage: 'Greater Than...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.greaterThanOrEqualTo', { defaultMessage: 'Greater Than Or Equal To...' }) }, + { onClick: () => openFilterWindow('<'), text: _t('filter.lessThan', { defaultMessage: 'Less Than...' }) }, + { onClick: () => openFilterWindow('<='), text: _t('filter.lessThanOrEqualTo', { defaultMessage: 'Less Than Or Equal To...' }) } ); } @@ -119,26 +120,26 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('+'), text: 'Contains...' }, - { onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' }, - { onClick: () => openFilterWindow('^'), text: 'Begins With...' }, - { onClick: () => openFilterWindow('!^'), text: 'Does Not Begin With...' }, - { onClick: () => openFilterWindow('$'), text: 'Ends With...' }, - { onClick: () => openFilterWindow('!$'), text: 'Does Not End With...' } + { onClick: () => openFilterWindow('+'), text: _t('filter.contains', { defaultMessage: 'Contains...' }) }, + { onClick: () => openFilterWindow('~'), text: _t('filter.doesNotContain', { defaultMessage: 'Does Not Contain...' }) }, + { onClick: () => openFilterWindow('^'), text: _t('filter.beginsWith', { defaultMessage: 'Begins With...' }) }, + { onClick: () => openFilterWindow('!^'), text: _t('filter.doesNotBeginWith', { defaultMessage: 'Does Not Begin With...' }) }, + { onClick: () => openFilterWindow('$'), text: _t('filter.endsWith', { defaultMessage: 'Ends With...' }) }, + { onClick: () => openFilterWindow('!$'), text: _t('filter.doesNotEndWith', { defaultMessage: 'Does Not End With...' }) } ); } if (filterBehaviour.supportBooleanValues) { res.push( - { onClick: () => setFilter('TRUE'), text: 'Is True' }, - { onClick: () => setFilter('FALSE'), text: 'Is False' } + { onClick: () => setFilter('TRUE'), text: _t('filter.isTrue', { defaultMessage: 'Is True' }) }, + { onClick: () => setFilter('FALSE'), text: _t('filter.isFalse', { defaultMessage: 'Is False' }) } ); } if (filterBehaviour.supportBooleanOrNull) { res.push( - { onClick: () => setFilter('TRUE, NULL'), text: 'Is True or NULL' }, - { onClick: () => setFilter('FALSE, NULL'), text: 'Is False or NULL' } + { onClick: () => setFilter('TRUE, NULL'), text: _t('filter.isTrueOrNull', { defaultMessage: 'Is True or NULL' }) }, + { onClick: () => setFilter('FALSE, NULL'), text: _t('filter.isFalseOrNull', { defaultMessage: 'Is False or NULL' }) } ); } @@ -146,44 +147,44 @@ res.push( { divider: true }, - { onClick: () => setFilter('TOMORROW'), text: 'Tomorrow' }, - { onClick: () => setFilter('TODAY'), text: 'Today' }, - { onClick: () => setFilter('YESTERDAY'), text: 'Yesterday' }, + { onClick: () => setFilter('TOMORROW'), text: _t('filter.tomorrow', { defaultMessage: 'Tomorrow' }) }, + { onClick: () => setFilter('TODAY'), text: _t('filter.today', { defaultMessage: 'Today' }) }, + { onClick: () => setFilter('YESTERDAY'), text: _t('filter.yesterday', { defaultMessage: 'Yesterday' }) }, { divider: true }, - { onClick: () => setFilter('NEXT WEEK'), text: 'Next Week' }, - { onClick: () => setFilter('THIS WEEK'), text: 'This Week' }, - { onClick: () => setFilter('LAST WEEK'), text: 'Last Week' }, + { onClick: () => setFilter('NEXT WEEK'), text: _t('filter.nextWeek', { defaultMessage: 'Next Week' }) }, + { onClick: () => setFilter('THIS WEEK'), text: _t('filter.thisWeek', { defaultMessage: 'This Week' }) }, + { onClick: () => setFilter('LAST WEEK'), text: _t('filter.lastWeek', { defaultMessage: 'Last Week' }) }, { divider: true }, - { onClick: () => setFilter('NEXT MONTH'), text: 'Next Month' }, - { onClick: () => setFilter('THIS MONTH'), text: 'This Month' }, - { onClick: () => setFilter('LAST MONTH'), text: 'Last Month' }, + { onClick: () => setFilter('NEXT MONTH'), text: _t('filter.nextMonth', { defaultMessage: 'Next Month' }) }, + { onClick: () => setFilter('THIS MONTH'), text: _t('filter.thisMonth', { defaultMessage: 'This Month' }) }, + { onClick: () => setFilter('LAST MONTH'), text: _t('filter.lastMonth', { defaultMessage: 'Last Month' }) }, { divider: true }, - { onClick: () => setFilter('NEXT YEAR'), text: 'Next Year' }, - { onClick: () => setFilter('THIS YEAR'), text: 'This Year' }, - { onClick: () => setFilter('LAST YEAR'), text: 'Last Year' } + { onClick: () => setFilter('NEXT YEAR'), text: _t('filter.nextYear', { defaultMessage: 'Next Year' }) }, + { onClick: () => setFilter('THIS YEAR'), text: _t('filter.thisYear', { defaultMessage: 'This Year' }) }, + { onClick: () => setFilter('LAST YEAR'), text: _t('filter.lastYear', { defaultMessage: 'Last Year' }) } ); } if (filterBehaviour.supportDatetimeComparison) { res.push( { divider: true }, - { onClick: () => openFilterWindow('<='), text: 'Before...' }, - { onClick: () => openFilterWindow('>='), text: 'After...' }, - { onClick: () => openFilterWindow('>=;<='), text: 'Between...' } + { onClick: () => openFilterWindow('<='), text: _t('filter.before', { defaultMessage: 'Before...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.after', { defaultMessage: 'After...' }) }, + { onClick: () => openFilterWindow('>=;<='), text: _t('filter.between', { defaultMessage: 'Between...' }) } ); } if (filterBehaviour.supportSqlCondition) { res.push( { divider: true }, - { onClick: () => openFilterWindow('sql'), text: 'SQL condition ...' }, - { onClick: () => openFilterWindow('sqlRight'), text: 'SQL condition - right side ...' } + { onClick: () => openFilterWindow('sql'), text: _t('filter.sqlCondition', { defaultMessage: 'SQL condition ...' }) }, + { onClick: () => openFilterWindow('sqlRight'), text: _t('filter.sqlConditionRight', { defaultMessage: 'SQL condition - right side ...' }) } ); } diff --git a/packages/web/src/modals/InputTextModal.svelte b/packages/web/src/modals/InputTextModal.svelte index 7ce64667e..22dbd1545 100644 --- a/packages/web/src/modals/InputTextModal.svelte +++ b/packages/web/src/modals/InputTextModal.svelte @@ -6,6 +6,7 @@ import FormTextField from '../forms/FormTextField.svelte'; import ModalBase from './ModalBase.svelte'; import { closeCurrentModal } from './modalTools'; + import { _t } from '../translations'; export let header; export let value; @@ -29,7 +30,7 @@ handleSubmit(e.detail)} data-testid="InputTextModal_ok" /> - + diff --git a/packages/web/src/modals/SetFilterModal.svelte b/packages/web/src/modals/SetFilterModal.svelte index 436d734ff..38e224852 100644 --- a/packages/web/src/modals/SetFilterModal.svelte +++ b/packages/web/src/modals/SetFilterModal.svelte @@ -10,6 +10,7 @@ import { closeCurrentModal } from './modalTools'; import FormRadioGroupItem from '../forms/FormRadioGroupItem.svelte'; import FormValues from '../forms/FormValues.svelte'; + import { _t } from '../translations'; export let condition1; export let onFilter; @@ -44,10 +45,10 @@ -
Set filter
+
{_t('filter.setFilter', {defaultMessage: 'Set filter'})}
-
Show rows where
+
{_t('filter.showRowsWhere', {defaultMessage: 'Show rows where'})}
@@ -62,9 +63,9 @@
- + {#if !filterBehaviour.disableOr} - + {/if}
@@ -84,7 +85,7 @@
- +
diff --git a/packages/web/src/modals/SetFilterModal_Select.svelte b/packages/web/src/modals/SetFilterModal_Select.svelte index dd4b54b15..2f0ffee8d 100644 --- a/packages/web/src/modals/SetFilterModal_Select.svelte +++ b/packages/web/src/modals/SetFilterModal_Select.svelte @@ -1,56 +1,57 @@ - - + + {#if advancedFields} diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 32076ef62..5933239a5 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -87,13 +87,13 @@ !driver.isElectronOnly || electron) @@ -109,7 +109,7 @@ {#if $authTypes && driver?.showConnectionField('authType', $values, showConnectionFieldArgs) && driver?.authTypeFirst} {#key $authTypes} {:else} @@ -164,8 +164,8 @@ name="useDatabaseUrl" matchValueToOption={(value, option) => !!option.value == !!value} options={[ - { label: 'Fill database connection details', value: '', default: true }, - { label: 'Use database URL', value: '1' }, + { label: _t('connection.fillDetails', { defaultMessage: 'Fill database connection details' }), value: '', default: true }, + { label: _t('connection.useUrl', { defaultMessage: 'Use database URL' }), value: '1' }, ]} />
@@ -173,7 +173,7 @@ {#if driver?.showConnectionField('databaseUrl', $values, showConnectionFieldArgs)}
- Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead + { _t('connection.dockerWarning', { defaultMessage: 'Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead' }) }
{/if} {/if} @@ -280,7 +280,7 @@
@@ -418,7 +418,7 @@ {#if driver?.showConnectionField('treeKeySeparator', $values, showConnectionFieldArgs)} + {/if} {#if driver}
{#if electron} {:else}
{#if $platformInfo && $platformInfo.sshAuthSock} - SSH Agent found + {_t('connection.sshTunnel.agentFound', {defaultMessage: "SSH Agent found"})} {:else} - SSH Agent not found + {_t('connection.sshTunnel.agentNotFound', {defaultMessage: "SSH Agent not found"})} {/if}
{/if} diff --git a/packages/web/src/settings/ConnectionSslFields.svelte b/packages/web/src/settings/ConnectionSslFields.svelte index 24936f42f..a50928458 100644 --- a/packages/web/src/settings/ConnectionSslFields.svelte +++ b/packages/web/src/settings/ConnectionSslFields.svelte @@ -7,6 +7,7 @@ import getElectron from '../utility/getElectron'; import FormPasswordField from '../forms/FormPasswordField.svelte'; import { openedConnections, openedSingleDatabaseConnections } from '../stores'; + import { _t } from '../translations'; const { values, setFieldValue } = getFormContext(); const electron = getElectron(); @@ -15,21 +16,21 @@ $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); - - + + - + diff --git a/packages/web/src/widgets/ConnectionList.svelte b/packages/web/src/widgets/ConnectionList.svelte index 0e9227335..01808473c 100644 --- a/packages/web/src/widgets/ConnectionList.svelte +++ b/packages/web/src/widgets/ConnectionList.svelte @@ -47,6 +47,7 @@ getOpenDetailOnArrowsSettings, } from '../settings/settingsTools'; import DropDownButton from '../buttons/DropDownButton.svelte'; + import { _t } from '../translations'; const connections = useConnectionList(); const serverStatus = useServerStatus(); @@ -58,7 +59,7 @@ let domContainer = null; let domFilter = null; - const RECENT_AND_UNSAVED_LABEL = 'Recent & unsaved'; + const RECENT_AND_UNSAVED_LABEL = _t('connection.recentUnsaved', { defaultMessage: 'Recent & unsaved' }); function extractConnectionParent(data, openedConnections, openedSingleDatabaseConnections) { if (data.parent) { @@ -193,12 +194,12 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); - res.push({ label: 'Display name', switchValue: 'displayName' }); - res.push({ label: 'Server', switchValue: 'server' }); - res.push({ label: 'User', switchValue: 'user' }); - res.push({ label: 'Database engine', switchValue: 'engine' }); - res.push({ label: 'Database name', switchValue: 'database' }); + res.push({ label: _t('common.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); + res.push({ label: _t('connection.displayName', { defaultMessage: 'Display name' }), switchValue: 'displayName' }); + res.push({ label: _t('connection.server', { defaultMessage: 'Server' }), switchValue: 'server' }); + res.push({ label: _t('connection.user', { defaultMessage: 'User' }), switchValue: 'user' }); + res.push({ label: _t('connection.engine', { defaultMessage: 'Database engine' }), switchValue: 'engine' }); + res.push({ label: _t('connection.database', { defaultMessage: 'Database name' }), switchValue: 'database' }); return res.map(item => ({ ...item, switchStore: connectionAppObjectSearchSettings, @@ -209,7 +210,7 @@ { @@ -227,16 +228,16 @@ {#if $commandsCustomized['new.connection']?.enabled} runCommand('new.connection')} - title="Add new connection" + title={_t('connection.new.title', { defaultMessage: 'Add new connection' })} data-testid="ConnectionList_buttonNewConnection" > - runCommand('new.connection.folder')} title="Add new connection folder"> + runCommand('new.connection.folder')} title={_t('connection.new.folder.title', { defaultMessage: 'Add new connection folder' })}> {/if} - + diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 96de61bcd..fbafef8a2 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -56,6 +56,7 @@ import FocusedConnectionInfoWidget from './FocusedConnectionInfoWidget.svelte'; import SubProcedureParamList from '../appobj/SubProcedureParamList.svelte'; import SubProcedureLineList from '../appobj/SubProcedureLineList.svelte'; + import { _t } from '../translations'; export let conid; export let database; @@ -130,20 +131,20 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); + res.push({ label: _t('sqlObject.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); if (driver?.databaseEngineTypes?.includes('document')) { - res.push({ label: 'Collection name', switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.collectionName', { defaultMessage: 'Collection name' }), switchValue: 'pureName' }); } if (driver?.databaseEngineTypes?.includes('sql')) { - res.push({ label: 'Table/view/procedure name', switchValue: 'pureName' }); - res.push({ label: 'Schema', switchValue: 'schemaName' }); - res.push({ label: 'Column name', switchValue: 'columnName' }); - res.push({ label: 'Column data type', switchValue: 'columnDataType' }); - res.push({ label: 'Table comment', switchValue: 'tableComment' }); - res.push({ label: 'Column comment', switchValue: 'columnComment' }); - res.push({ label: 'View/procedure/trigger text', switchValue: 'sqlObjectText' }); - res.push({ label: 'Table engine', switchValue: 'tableEngine' }); - res.push({ label: 'Only tables with rows', switchValue: 'tablesWithRows' }); + res.push({ label: _t('sqlObject.tableViewProcedureName', { defaultMessage: 'Table/view/procedure name' }), switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.schemaName', { defaultMessage: 'Schema' }), switchValue: 'schemaName' }); + res.push({ label: _t('sqlObject.columnName', { defaultMessage: 'Column name' }), switchValue: 'columnName' }); + res.push({ label: _t('sqlObject.columnDataType', { defaultMessage: 'Column data type' }), switchValue: 'columnDataType' }); + res.push({ label: _t('sqlObject.tableComment', { defaultMessage: 'Table comment' }), switchValue: 'tableComment' }); + res.push({ label: _t('sqlObject.columnComment', { defaultMessage: 'Column comment' }), switchValue: 'columnComment' }); + res.push({ label: _t('sqlObject.viewProcedureTriggerText', { defaultMessage: 'View/procedure/trigger text' }), switchValue: 'sqlObjectText' }); + res.push({ label: _t('sqlObject.tableEngine', { defaultMessage: 'Table engine' }), switchValue: 'tableEngine' }); + res.push({ label: _t('sqlObject.tablesWithRows', { defaultMessage: 'Only tables with rows' }), switchValue: 'tablesWithRows' }); } return res.map(item => ({ ...item, @@ -175,7 +176,7 @@ - Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {:else if objectList.length == 0 && $status && $status.name != 'pending' && $status.name != 'checkStructure' && $status.name != 'loadStructure' && $objects}
- Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {#if driver?.databaseEngineTypes?.includes('sql')}
- runCommand('new.table')}>New table + runCommand('new.table')}>{_t('database.newTable', { defaultMessage: 'New table' })} {/if} {#if driver?.databaseEngineTypes?.includes('document')}
@@ -211,7 +212,7 @@ {:else} { @@ -259,7 +260,7 @@ data-testid="SqlObjectList_container" > {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects} - + {:else} Date: Mon, 27 Oct 2025 15:45:17 +0100 Subject: [PATCH 013/124] SYNC: fixed test --- e2e-tests/cypress/e2e/charts.cy.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/e2e-tests/cypress/e2e/charts.cy.js b/e2e-tests/cypress/e2e/charts.cy.js index b1196aa2a..0bd54c4b0 100644 --- a/e2e-tests/cypress/e2e/charts.cy.js +++ b/e2e-tests/cypress/e2e/charts.cy.js @@ -110,7 +110,7 @@ describe('Charts', () => { cy.themeshot('new-object-window'); }); - it('Database chat - charts', () => { + it.only('Database chat - charts', () => { cy.contains('MySql-connection').click(); cy.contains('MyChinook').click(); cy.testid('TabsPanel_buttonNewObject').click(); @@ -119,8 +119,7 @@ describe('Charts', () => { cy.get('body').realType('show me chart of most popular genres'); cy.get('body').realPress('{enter}'); cy.testid('DatabaseChatTab_executeAllQueries', { timeout: 30000 }).click(); - cy.wait(5000); - cy.testid('chart-canvas').should($c => expect($c[0].toDataURL()).to.match(/^data:image\/png;base64/)); + cy.testid('chart-canvas', { timeout: 30000 }).should($c => expect($c[0].toDataURL()).to.match(/^data:image\/png;base64/)); cy.themeshot('database-chat-chart'); }); From 26d34f896b5ac62725b52cb6de15606ee2a54210 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 16:20:24 +0100 Subject: [PATCH 014/124] changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82ddc86c2..4ab7db5b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,19 @@ Builds: - linux - application for linux - win - application for Windows +## 6.6.6 - not released yet +- ADDED: Allow disable/re-enable filter #1174 +- ADDED: Close right side tabs #1219 +- ADDED: Ability disable execute current line in query editor #1209 +- ADDED: Support for Redis Cluster #1204 (Premium) + ## 6.6.5 - ADDED: SQL AI assistant - powered by database chat, could help you to write SQL queries (Premium) - ADDED: Explain SQL error (powered by AI) (Premium) - ADDED: Database chat (and SQL AI Assistant) now supports showing charts (Premium) - FIXED: Fxied editing new files and roles (Team Premium) - FIXED: Connection to standalone database could be now pinned +- FIXED: Cannot open up large JSON file #1215 ## 6.6.4 - ADDED: AI Database chat now supports much more LLM models. (Premium) From 2d135d708e38617166477064f200430ef2f4b4b6 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 17:18:48 +0100 Subject: [PATCH 015/124] v6.6.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65fda0599..0a2444f7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-premium-beta.18", + "version": "6.6.6", "name": "dbgate-all", "workspaces": [ "packages/*", From 0e2a77ced7cca2879df96a9ff01cbf7e5588d3e9 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 17:19:16 +0100 Subject: [PATCH 016/124] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ab7db5b6..c5342aa98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ Builds: - linux - application for linux - win - application for Windows -## 6.6.6 - not released yet +## 6.6.6 - ADDED: Allow disable/re-enable filter #1174 - ADDED: Close right side tabs #1219 - ADDED: Ability disable execute current line in query editor #1209 From 6934cdd1223b2a864d6b86591cf8f1e0a3096feb Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 13:08:37 +0100 Subject: [PATCH 017/124] json UI improvements --- .../src/jsonui/JsonUiContentRenderer.svelte | 2 ++ .../web/src/jsonui/JsonUiCountdown.svelte | 16 +++++++++++++- .../web/src/jsonui/JsonUiHighlight.svelte | 15 ++++++++++--- .../web/src/jsonui/JsonUiLinkButton.svelte | 3 --- .../src/jsonui/JsonUiLinkButtonBlock.svelte | 21 +++++++++++++++++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte diff --git a/packages/web/src/jsonui/JsonUiContentRenderer.svelte b/packages/web/src/jsonui/JsonUiContentRenderer.svelte index 07fdcb667..517d4915b 100644 --- a/packages/web/src/jsonui/JsonUiContentRenderer.svelte +++ b/packages/web/src/jsonui/JsonUiContentRenderer.svelte @@ -3,6 +3,7 @@ import JsonUiHeading from './JsonUiHeading.svelte'; import JsonUiHighlight from './JsonUiHighlight.svelte'; import JsonUiLinkButton from './JsonUiLinkButton.svelte'; + import JsonUiLinkButtonBlock from './JsonUiLinkButtonBlock.svelte'; import JsonUiMarkdown from './JsonUiMarkdown.svelte'; import JsonUiTextBlock from './JsonUiTextBlock.svelte'; import JsonUiTickList from './JsonUiTickList.svelte'; @@ -19,6 +20,7 @@ markdown: JsonUiMarkdown, highlight: JsonUiHighlight, countdown: JsonUiCountdown, + buttonblock: JsonUiLinkButtonBlock, } as const; diff --git a/packages/web/src/jsonui/JsonUiCountdown.svelte b/packages/web/src/jsonui/JsonUiCountdown.svelte index c0e196f05..db11a62f1 100644 --- a/packages/web/src/jsonui/JsonUiCountdown.svelte +++ b/packages/web/src/jsonui/JsonUiCountdown.svelte @@ -1,8 +1,10 @@ {#if validTo} -
+
{ + if (link) { + openWebLink(link); + } + }} + > Offer ends in:
{#each parts as part} @@ -62,6 +72,10 @@ padding: 5px; } + .countdown.isLink { + cursor: pointer; + } + .big { font-size: large; font-weight: bold; diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte index 8437d7a84..697a2cb04 100644 --- a/packages/web/src/jsonui/JsonUiHighlight.svelte +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -1,19 +1,28 @@ -
- {text} -
+{#if link} + + {text} + +{:else} +
+ {text} +
+{/if} diff --git a/packages/web/src/jsonui/JsonUiLinkButton.svelte b/packages/web/src/jsonui/JsonUiLinkButton.svelte index e3d2ce311..e9a00925c 100644 --- a/packages/web/src/jsonui/JsonUiLinkButton.svelte +++ b/packages/web/src/jsonui/JsonUiLinkButton.svelte @@ -5,9 +5,6 @@ export let text: string; export let link: string; export let colorClass: string = ''; - - // very light url guard - const safe = /^(https?:)?\/\//i.test(link) || link.startsWith('/');
diff --git a/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte b/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte new file mode 100644 index 000000000..9800e831e --- /dev/null +++ b/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte @@ -0,0 +1,21 @@ + + +
+ {#each items as item} + openWebLink(item.link)} value={item.text} skipWidth {colorClass} /> + {/each} +
+ + From e57e2469917c7f402b4e48fa9ca70ddb692a73c4 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 13:59:47 +0100 Subject: [PATCH 018/124] SYNC: fixed web info --- packages/web/src/EnterLicensePage.svelte | 4 ++-- packages/web/src/ErrorPage.svelte | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web/src/EnterLicensePage.svelte b/packages/web/src/EnterLicensePage.svelte index 79fdf6104..f3ae2ab59 100644 --- a/packages/web/src/EnterLicensePage.svelte +++ b/packages/web/src/EnterLicensePage.svelte @@ -125,8 +125,8 @@ {/if}
- For more info about DbGate licensing, you could visit dbgate.eu web or contact - us at sales@dbgate.eu + For more info about DbGate licensing, you could visit dbgate.io web or contact + us at sales@dbgate.io
{:else} diff --git a/packages/web/src/ErrorPage.svelte b/packages/web/src/ErrorPage.svelte index a24063184..42aa2f941 100644 --- a/packages/web/src/ErrorPage.svelte +++ b/packages/web/src/ErrorPage.svelte @@ -16,7 +16,7 @@
Configuration error
{#if $config?.checkedLicense?.status == 'error'} {:else if $config?.configurationError} From f0ac047978581b6675a543b5e0f39ae4fa2ec479 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:26:05 +0100 Subject: [PATCH 019/124] v6.6.7-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a2444f7e..bea34016a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6", + "version": "6.6.7-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From 47eb74d5babecb52d89ff5d6d8e701a186bcd1fc Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:59:14 +0100 Subject: [PATCH 020/124] fix --- .../web/src/jsonui/JsonUiHighlight.svelte | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte index 697a2cb04..4b083ee89 100644 --- a/packages/web/src/jsonui/JsonUiHighlight.svelte +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -1,18 +1,22 @@ -{#if link} - - {text} - -{:else} -
- {text} -
-{/if} +
{ + if (link) { + openWebLink(link); + } + }} +> + {text} +
From b087df8d978a5813e95a6e882dcd5ebbb5b34290 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:59:28 +0100 Subject: [PATCH 021/124] v6.6.7-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bea34016a..ef7beac4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7-beta.1", + "version": "6.6.7-beta.2", "name": "dbgate-all", "workspaces": [ "packages/*", From e2546578137f238dc490d99916f3ff6b496a6397 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 15:06:30 +0100 Subject: [PATCH 022/124] remvoed links to dbgate.org --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 40b0051af..639af9c4c 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,9 @@ DbGate is licensed under GPL-3.0 license and is free to use for any purpose. * Try it online - [demo.dbgate.org](https://demo.dbgate.org) - online demo application * **Download** application for Windows, Linux or Mac from [dbgate.io](https://www.dbgate.io/download/) -* Looking for DbGate Community? **Download** from [dbgate.org](https://dbgate.org/download/) +* Looking for DbGate Community? **Download** from [dbgate.io](https://www.dbgate.io/download-community/) * Run web version as [NPM package](https://www.npmjs.com/package/dbgate-serve) or as [docker image](https://hub.docker.com/r/dbgate/dbgate) * Use nodeJs [scripting interface](https://docs.dbgate.io/scripting) ([API documentation](https://docs.dbgate.io/apidoc)) -* [Recommend DbGate](https://testimonial.to/dbgate) | [Rate on G2](https://www.g2.com/products/dbgate/reviews) -* [Give us feedback](https://dbgate.org/feedback) - it will help us to decide, how to improve DbGate in future -* We [offer 2-year PREMIUM license](https://dbgate.org/review/) for any honest review on these platforms (time-limited offer) ## Supported databases * MySQL @@ -93,7 +90,6 @@ Any contributions are welcome. If you want to contribute without coding, conside * Tell your friends about DbGate or share on social networks - when more people will use DbGate, it will grow to be better * Purchase a [DbGate Premium](https://www.dbgate.io/purchase/premium/) license -* Write review on [Product Hunt](https://www.producthunt.com/products/dbgate) or [G2](https://www.g2.com/products/dbgate/reviews) - we offer [2-year PREMIUM license](https://dbgate.org/review/) for reviewers (time limited offer) * Create issue, if you find problem in app, or you have idea to new feature. If issue already exists, you could leave comment on it, to prioritise most wanted issues * Create some tutorial video on [youtube](https://www.youtube.com/playlist?list=PLCo7KjCVXhr0RfUSjM9wJMsp_ShL1q61A) * Become a backer on [GitHub sponsors](https://github.com/sponsors/dbgate) or [Open collective](https://opencollective.com/dbgate) From 46553a80adadb6eb8ef2880c156393a26d3362a8 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 15:20:51 +0100 Subject: [PATCH 023/124] v6.6.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef7beac4d..4861194d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7-beta.2", + "version": "6.6.7", "name": "dbgate-all", "workspaces": [ "packages/*", From acb4f5924e80c4c3f6456da209b988284791ce0b Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 16:43:28 +0100 Subject: [PATCH 024/124] upgrade button --- packages/web/src/tabpanel/TabsPanel.svelte | 42 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/web/src/tabpanel/TabsPanel.svelte b/packages/web/src/tabpanel/TabsPanel.svelte index 997349c43..4565e8673 100644 --- a/packages/web/src/tabpanel/TabsPanel.svelte +++ b/packages/web/src/tabpanel/TabsPanel.svelte @@ -358,6 +358,8 @@ import { handleAfterTabClick } from '../utility/changeCurrentDbByTab'; import { getBoolSettingsValue } from '../settings/settingsTools'; import NewObjectModal from '../modals/NewObjectModal.svelte'; + import { isProApp } from '../utility/proTools'; + import { openWebLink } from '../utility/simpleTools'; export let multiTabIndex; export let shownTab; @@ -583,7 +585,13 @@
-
+
{#each groupedTabs as tabGroup}
{#if !$lockedDatabaseMode} @@ -713,7 +721,7 @@ {/each}
- {#if allowSplitTab} + {#if allowSplitTab && isProApp()}
splitTab(multiTabIndex)} @@ -723,6 +731,20 @@
{/if} + + {#if !isProApp()} +
{ + openWebLink('https://www.dbgate.io/purchase/premium/?utm_campaign=premiumUpgradeButton'); + }} + title="Upgrade to Premium" + data-testid="TabsPanel_buttonUpgrade" + > + Upgrade +
+ {/if} +
showModal(NewObjectModal, { multiTabIndex })} @@ -756,6 +778,18 @@ color: var(--theme-font-2); cursor: pointer; } + .upgrade-button { + background: linear-gradient(135deg, #1686c8, #8a25b1); + border: 1px solid var(--theme-border); + border-radius: 10px; + color: white; + cursor: pointer; + font-size: 10pt; + padding: 5px; + } + .upgrade-button:hover { + background: linear-gradient(135deg, #0f5a85, #5c1870); + } .icon-button:hover { color: var(--theme-font-1); } @@ -769,6 +803,10 @@ right: 35px; bottom: 0; } + + .tabs-upgrade-button { + right: 120px; + } .tabs.can-split { right: 60px; } From ba0ecaf70fb4d7adef83d794e2aab5b313d1cec7 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 16:47:52 +0100 Subject: [PATCH 025/124] fix --- packages/web/src/tabpanel/TabsPanel.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web/src/tabpanel/TabsPanel.svelte b/packages/web/src/tabpanel/TabsPanel.svelte index 4565e8673..d38637874 100644 --- a/packages/web/src/tabpanel/TabsPanel.svelte +++ b/packages/web/src/tabpanel/TabsPanel.svelte @@ -736,7 +736,9 @@
{ - openWebLink('https://www.dbgate.io/purchase/premium/?utm_campaign=premiumUpgradeButton'); + openWebLink( + `https://www.dbgate.io/purchase/${isElectronAvailable() ? 'premium' : 'team-premium'}/?utm_campaign=premiumUpgradeButton` + ); }} title="Upgrade to Premium" data-testid="TabsPanel_buttonUpgrade" From 8663ab2d2820380c7c78928475a4e4455f466ee0 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 09:33:26 +0100 Subject: [PATCH 026/124] translation-settings,common --- .../web/src/settings/SettingsModal.svelte | 207 ++++++++-------- packages/web/src/translations.ts | 2 + translations/cs.json | 232 +++++++++++++++++- translations/en.json | 164 ++++++++++++- translations/sk.json | 231 +++++++++++++++++ 5 files changed, 732 insertions(+), 104 deletions(-) create mode 100644 translations/sk.json diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte index a68f98941..198c01009 100644 --- a/packages/web/src/settings/SettingsModal.svelte +++ b/packages/web/src/settings/SettingsModal.svelte @@ -44,6 +44,10 @@ import AiSettingsTab from './AiSettingsTab.svelte'; import { _t } from '../translations'; import hasPermission from '../utility/hasPermission'; + import ConfirmModal from '../modals/ConfirmModal.svelte'; + import { showModal } from '../modals/modalTools'; + import { internalRedirectTo } from '../clientAuth'; + import { getSelectedLanguage } from '../translations'; const electron = getElectron(); let restartWarning = false; @@ -93,7 +97,7 @@ ORDER BY -
Settings
+
{_t('settings.title', { defaultMessage: 'Settings' })}
{#if electron} -
Appearance
+
{_t('settings.appearance', { defaultMessage: 'Appearance' })}
{#if restartWarning}
- Native menu settings will be applied after app restart + {_t('settings.nativeMenuRestartWarning', { defaultMessage: 'Native menu settings will be applied after app restart' })}
{/if} {/if} -
Data grid
+
{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}
- + - + - + -
SQL editor
+
{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}
- +
- + ($currentEditorWrapEnabled = e.target.checked)} @@ -243,33 +247,33 @@ ORDER BY -
Connection
+
{_t('settings.connection', { defaultMessage: 'Connection' })}
{ @@ -282,17 +286,17 @@ ORDER BY -
Query sessions
+
{_t('settings.session', { defaultMessage: 'Query sessions' })}
-
Application theme
+
{_t('settings.appearance', { defaultMessage: 'Application theme' })}
{ @@ -352,19 +356,19 @@ ORDER BY
- More themes are available as plugins + {_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })} plugins
- After installing theme plugin (try search "theme" in available extensions) new themes will be available here. + {_t('settings.appearance.afterInstalling', { defaultMessage: 'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.' })}
-
Editor theme
+
{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}
- + ({ label: theme, value: theme }))} value={$currentEditorTheme} on:change={e => ($currentEditorTheme = e.detail)} @@ -373,7 +377,7 @@ ORDER BY
- +
- + ($currentEditorFontSize = e.target['value'])} @@ -396,7 +400,7 @@ ORDER BY
- +
@@ -405,68 +409,68 @@ ORDER BY
-
Default actions
+
{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}
- +
-
Behaviour
+
{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}
- +
- When you single-click or select a file in the "Tables, Views, Functions" view, it - is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing - tables and don't want every visited table to have its own tab. When you start editing the table or use double-click - to open the table from the "Tables" view, a new tab is dedicated to that table. + {_t('settings.behaviour.singleClickPreview', { defaultMessage: 'When you single-click or select a file in the "Tables, Views, Functions" view, it is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing tables and don\'t want every visited table to have its own tab. When you start editing the table or use double-click to open the table from the "Tables" view, a new tab is dedicated to that table.' })}
-
Confirmations
+
{_t('settings.confirmations', { defaultMessage: 'Confirmations' })}
- +
-
Other
+
{_t('settings.other', { defaultMessage: 'Other' })}
- + {#if isProApp()} {/if}
-
License
+
{_t('settings.other.license', { defaultMessage: 'License' })}
{ licenseKeyCheckResult = await apiCall('config/check-license', { licenseKey: value }); @@ -536,28 +537,28 @@ ORDER BY
{#if licenseKeyCheckResult.status == 'ok'}
- License key is valid + { _t('settings.other.licenseKey.valid', { defaultMessage: 'License key is valid' }) }
{#if licenseKeyCheckResult.validTo}
- License valid to: {licenseKeyCheckResult.validTo} + { _t('settings.other.licenseKey.validTo', { defaultMessage: 'License valid to:' }) } {licenseKeyCheckResult.validTo}
{/if} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if} {:else if licenseKeyCheckResult.status == 'error'}
- {licenseKeyCheckResult.errorMessage ?? 'License key is invalid'} + {licenseKeyCheckResult.errorMessage ?? _t('settings.other.licenseKey.invalid', { defaultMessage: 'License key is invalid' })} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if}
{#if licenseKeyCheckResult.isExpired}
{ licenseKeyCheckResult = await apiCall('config/get-new-license', { oldLicenseKey: licenseKey }); @@ -574,24 +575,32 @@ ORDER BY -
External tools
+
{_t('settings.externalTools', { defaultMessage: 'External tools' })}
- + - +
@@ -602,7 +611,7 @@ ORDER BY
- +
diff --git a/packages/web/src/translations.ts b/packages/web/src/translations.ts index c6bbb56a4..b1665567b 100644 --- a/packages/web/src/translations.ts +++ b/packages/web/src/translations.ts @@ -1,4 +1,5 @@ import cs from '../../../translations/cs.json'; +import sk from '../../../translations/sk.json'; import MessageFormat, { MessageFunction } from '@messageformat/core'; import { getStringSettingsValue } from './settings/settingsTools'; @@ -6,6 +7,7 @@ import { getStringSettingsValue } from './settings/settingsTools'; const translations = { en: {}, cs, + sk, }; const supportedLanguages = Object.keys(translations); diff --git a/translations/cs.json b/translations/cs.json index 0967ef424..735ada06f 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -1 +1,231 @@ -{} +{ + "app.databaseName": "Název databáze", + "app.preparingPlugins": "Příprava pluginů...", + "app.starting": "Spouštění DbGate", + "authToken": "Auth token", + "column.copyName": "Kopírovat název", + "column.dropColumn": "Odstranit sloupec", + "column.renameColumn": "Přejmenovat sloupec", + "command.datagrid.addNewColumn": "Přidat nový sloupec", + "command.datagrid.addNewColumn.toolbar": "Nový sloupec", + "command.datagrid.cloneRows": "Klonovat řádky", + "command.datagrid.cloneRows.toolbar": "Klonovat řádek(y)", + "command.datagrid.copyToClipboard": "Kopírovat do schránky", + "command.datagrid.deleteSelectedRows": "Odstranit vybrané řádky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstranit řádek(y)", + "command.datagrid.editJsonDocument": "Upravit řádek jako JSON dokument", + "command.datagrid.insertNewRow": "Vložit nový řádek", + "command.datagrid.insertNewRow.toolbar": "Nový řádek", + "command.datagrid.loadCellFromFile": "Načíst buňku ze souboru", + "command.datagrid.openJsonArrayInSheet": "Otevřít pole jako tabulku", + "command.datagrid.openSelectionInMap": "Otevřít výběr v mapě", + "command.datagrid.reconnect": "Znovu připojit", + "command.datagrid.redo": "Znovu", + "command.datagrid.removeField": "Odstranit pole", + "command.datagrid.revertAllChanges": "Vrátit všechny změny", + "command.datagrid.revertAllChanges.toolbar": "Vrátit vše", + "command.datagrid.revertRowChanges": "Vrátit změny řádku", + "command.datagrid.saveCellToFile": "Uložit buňku do souboru", + "command.datagrid.setNull": "Nastavit NULL", + "command.datagrid.undo": "Krok zpět", + "command.datagrid.viewJsonDocument": "Zobrazit řádek jako JSON dokument", + "command.datagrid.viewJsonValue": "Zobrazit buňku jako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáze", + "command.new.sqliteDatabase": "Nová SQLite databáze", + "command.tabs.addToFavorites": "Přidat aktuální kartu do oblíbených", + "command.tabs.closeAll": "Zavřít všechny karty", + "command.tabs.closeTab": "Zavřít kartu", + "command.tabs.closeTabsButCurrentDb": "Zavřít karty kromě aktuální DB", + "command.tabs.closeTabsWithCurrentDb": "Zavřít karty s aktuální DB", + "command.tabs.nextTab": "Další karta", + "command.tabs.previousTab": "Předchozí karta", + "command.tabs.reopenClosedTab": "Znovu otevřít zavřenou kartu", + "common.archive": "Archivovat (JSONL)", + "common.close": "Zavřít", + "common.connections": "Připojení", + "common.database": "Databáze", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Ukončit", + "common.query": "Dotaz", + "common.refresh": "Obnovit", + "common.save": "Uložit", + "common.saveToArchive": "Uložit do archívu", + "common.schema": "Schéma", + "connection.connect": "Připojit", + "connection.createDatabase": "Vytvořit databázi", + "connection.databaseName": "Název databáze", + "connection.delete": "Odstranit", + "connection.disconnect": "Odpojit", + "connection.duplicate": "Duplikovat", + "connection.edit": "Upravit", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnovit", + "connection.serverSummary": "Shrnutí serveru", + "connection.viewDetails": "Zobrazit detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnat", + "database.copyDatabaseName": "Kopírovat název databáze", + "database.createDatabaseBackup": "Vytvořit zálohu databáze", + "database.createNewApplication": "Vytvořit novou aplikaci", + "database.dataDeployer": "Nasazovač dat", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektivního dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojit", + "database.dropDatabase": "Odstranit databázi", + "database.editApplications": "Upravit aplikaci", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Vygenerovat skript", + "database.import": "Import", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabulka", + "database.perspective": "Perspektiva #", + "database.profiler": "Profiler", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnovit schémata", + "database.restore": "Obnovit #", + "database.restoreDatabaseBackup": "Obnovit zálohu databáze", + "database.shellDropAllObjects": "Shell: Odstranit všechny objekty", + "database.shellRunScript": "Shell: Spustit skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobrazit diagram", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné připojení k databázi, ovladač nebyl nalezen", + "error.selectedCloudConnection": "Vybrané připojení je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané připojení není z DbGate cloudu", + "file.allSupported": "Všechny podporované soubory", + "file.diagramFiles": "Soubory diagramů", + "file.duckdb": "Databáze DuckDB", + "file.jsonFiles": "Soubory JSON", + "file.perspectiveFiles": "Soubory perspektivy", + "file.queryDesignerFiles": "Soubory návrháře dotazů", + "file.sqlFiles": "Soubory SQL", + "file.sqliteDatabase": "Databáze SQLite", + "importExport.createZipFileInArchive": "Vytvořit ZIP soubor v archivu", + "importExport.exportToZipArchive": "Exportovat do ZIP archivu", + "importExport.exportToZipFile": "Exportovat do ZIP souboru", + "importExport.importFromZipArchive": "Importovat z ZIP archivu", + "importExport.importFromZipFile": "Importovat z ZIP souboru (v archivní složce)", + "importExport.sourceFiles": "Zdrojové soubory", + "importExport.tablesViewsCollections": "Tabulky / pohledy / kolekce", + "schema.add": "Přidat nové schéma", + "schema.createSchema": "Vytvořit schéma", + "schema.delete": "Odstranit schéma", + "schema.resetToDefault": "Resetovat na výchozí", + "schema.schemaName": "Název schématu", + "serverSummaryTab.databases": "Databáze", + "serverSummaryTab.errorTitle": "Chyba při načítání shrnutí serveru", + "serverSummaryTab.loadingMessage": "Načítání detailů serveru", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Proměnné", + "settings.appearance": "Vzhled aplikace", + "settings.appearance.customSize": "Vlastní velikost", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použít výchozí téma)", + "settings.appearance.fontFamily": "Písmo editoru", + "settings.appearance.fontSize": "Velikost fontu", + "settings.appearance.moreThemes": "Více témat je k dispozici jako", + "settings.appearance.useSystemTheme": "Použít systémové téma", + "settings.behaviour": "Chování", + "settings.behaviour.jsonPreviewWrap": "Zalomit JSON v náhledu", + "settings.behaviour.openDetailOnArrows": "Otevřít detail při navigaci klávesnicí", + "settings.behaviour.useTabPreviewMode": "Použít režim náhledu na kartě", + "settings.confirmations": "Potvrzení", + "settings.confirmations.skipConfirm.collectionDataSave": "Přeskočit potvrzení při ukládání údajů kolekce (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Přeskočit potvrzení při ukládání údajů tabulky (SQL)", + "settings.connection": "Připojení", + "settings.connection.autoRefresh": "Automatické obnovení modelu databáze na pozadí", + "settings.connection.autoRefreshInterval": "Interval mezi automatickým načítáním struktury DB v sekundách", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobrazit pouze karty z vybrané databáze", + "settings.connection.sshBindHost": "Adresa localhostu pro SSH připojení", + "settings.dataGrid.alignNumbersRight": "Zarovnat čísla doprava", + "settings.dataGrid.collectionPageSize": "Velikost stránky kolekce (pro MongoDB JSON zobrazení, musí být mezi 5 a 50000)", + "settings.dataGrid.coloringMode": "Režim zabarvení řádků", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. řádek, primární barva", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. řádek, sekundární barva", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. řádek", + "settings.dataGrid.coloringMode.none": "Žádný", + "settings.dataGrid.defaultAutoRefreshInterval": "Výchozí interval automatického obnovení mřížky (v sekundách)", + "settings.dataGrid.pageSize": "Velikost stránky (počet řádků pro inkrementální načítání, musí být mezi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobrazit všechny sloupce při hledání", + "settings.dataGrid.showHintColumns": "Zobrazit nápovědu pro cizí klíče", + "settings.dataGrid.thousandsSeparator": "Použít oddělovač tisíců pro čísla", + "settings.dataGrid.title": "Mřížka dat", + "settings.defaultActions": "Výchozí akce", + "settings.defaultActions.collectionClick": "Kliknutí na kolekci", + "settings.defaultActions.connectionClick": "Kliknutí na připojení", + "settings.defaultActions.connectionClick.connect": "Připojit", + "settings.defaultActions.connectionClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.connectionClick.openDetails": "Upravit / otevřít detaily", + "settings.defaultActions.databaseClick": "Kliknutí na databázi", + "settings.defaultActions.databaseClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.databaseClick.switch": "Přepnout databázi", + "settings.defaultActions.functionClick": "Kliknutí na funkci", + "settings.defaultActions.materializedViewClick": "Kliknutí na materializovaný pohled", + "settings.defaultActions.procedureClick": "Kliknutí na proceduru", + "settings.defaultActions.tableClick": "Kliknutí na tabulku", + "settings.defaultActions.useLastUsedAction": "Použít naposledy použitou akci", + "settings.defaultActions.viewClick": "Kliknutí na pohled", + "settings.editor.keybinds": "Klávesové zkratky editoru", + "settings.editor.wordWrap": "Povolit zalamování textu", + "settings.externalTools": "Externí nástroje", + "settings.general": "Obecné", + "settings.license": "Licence", + "settings.localization": "Lokalizace", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikace bude restartována, aby se změnil jazyk", + "settings.nativeMenuRestartWarning": "Nastavení nativního menu budou aplikována po restartu aplikace", + "settings.other": "Ostatní", + "settings.other.ai.allowSendModels": "Povolit odesílání DB modelů a dotazových fragmentů do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovat aplikaci", + "settings.other.autoUpdateApplication.check": "Zkontrolovat dostupnost nových verzí", + "settings.other.autoUpdateApplication.download": "Zkontrolovat a stáhnout nové verze", + "settings.other.autoUpdateApplication.skip": "Nekontrolovat nové verze", + "settings.other.externalTools.mysql": "mysql (obnovení databáze MySQL)", + "settings.other.externalTools.mysqlPlugins": "Složka s MySQL pluginy (například pro autentizaci). Nastavit pouze v případě problémů", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databáze MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databáze PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovení databáze PostgreSQL)", + "settings.other.gistCreateToken": "API token pro vytváření chybových gistů", + "settings.other.license": "Licence", + "settings.other.licenseKey": "Licenční klíč", + "settings.other.licenseKey.checkForNew": "Ověřit nový licenční klíč", + "settings.other.licenseKey.expiration": "Expirace licenčního klíče:", + "settings.other.licenseKey.invalid": "Licenční klíč je neplatný", + "settings.other.licenseKey.valid": "Licenční klíč je platný", + "settings.other.licenseKey.validTo": "Licence platná do:", + "settings.session": "Dotazové relace", + "settings.session.autoClose": "Automatické uzavření dotazových relací po období nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po kterém je dotazová relace bez aktivity uzavřena (v minutách)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázat vykonání aktuálního řádku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázat rozdělení podle prázdného řádku", + "settings.sqlEditor.limitRows": "Vrátit pouze N řádků při spuštění dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobrazit aliasy tabulek v dokončování kódu", + "settings.sqlEditor.sqlCommandsCase": "Velikost písmen SQL příkazů", + "settings.tabGroup.showServerName": "Zobrazit název serveru vedle názvu databáze v záhlaví skupiny karet", + "settings.theme": "Vzhled", + "settings.title": "Nastavení", + "summaryProcesses.actions": "Akce", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID připojení", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operace", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas běhu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čeká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Proměnná", + "tab.administration": "Administrace", + "widget.databaseContent": "Obsah databáze", + "widget.databases": "Databáze", + "widget.keys": "Klíče", + "widget.pinned": "Připnuté", + "widget.tablesViewsFunctions": "Tabulky, pohledy, funkce" +} \ No newline at end of file diff --git a/translations/en.json b/translations/en.json index 3eadc7994..d232d8fcd 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1,7 +1,11 @@ { + "app.databaseName": "Database name", "app.preparingPlugins": "Preparing plugins ...", "app.starting": "Starting DbGate", "authToken": "Auth token", + "column.copyName": "Copy name", + "column.dropColumn": "Drop column", + "column.renameColumn": "Rename column", "command.datagrid.addNewColumn": "Add new column", "command.datagrid.addNewColumn.toolbar": "New column", "command.datagrid.cloneRows": "Clone rows", @@ -27,9 +31,7 @@ "command.datagrid.viewJsonDocument": "View row as JSON document", "command.datagrid.viewJsonValue": "View cell as JSON document", "command.new.duckdbDatabase": "New DuckDB database", - "command.new.duckdbDatabase.header": "Create DuckDB database", "command.new.sqliteDatabase": "New SQLite database", - "command.new.sqliteDatabase.header": "Create SQLite database", "command.tabs.addToFavorites": "Add current tab to favorites", "command.tabs.closeAll": "Close all tabs", "command.tabs.closeTab": "Close tab", @@ -38,12 +40,17 @@ "command.tabs.nextTab": "Next tab", "command.tabs.previousTab": "Previous tab", "command.tabs.reopenClosedTab": "Reopen closed tab", - "common.archive": "Archive", + "common.archive": "Archive (JSONL)", + "common.close": "Close", "common.connections": "Connections", "common.database": "Database", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Kill", "common.query": "Query", "common.refresh": "Refresh", "common.save": "Save", + "common.saveToArchive": "Save to archive", "common.schema": "Schema", "connection.connect": "Connect", "connection.createDatabase": "Create database", @@ -56,7 +63,53 @@ "connection.refresh": "Refresh", "connection.serverSummary": "Server summary", "connection.viewDetails": "View details", + "database.backup": "Backup #", + "database.compare": "Compare", + "database.copyDatabaseName": "Copy database name", + "database.createDatabaseBackup": "Create database backup", + "database.createNewApplication": "Create new application", + "database.dataDeployer": "Data deployer", + "database.databaseChat": "Database chat", + "database.databaseProfiler": "Database profiler", + "database.designPerspectiveQuery": "Design perspective query", + "database.designQuery": "Design query", + "database.diagram": "Diagram #", + "database.disconnect": "Disconnect", + "database.dropDatabase": "Drop database", + "database.editApplications": "Edit application", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Generate script", + "database.import": "Import", + "database.newQuery": "New query", + "database.newTable": "New table", + "database.perspective": "Perspective #", + "database.profiler": "Profiler", + "database.queryDesigner": "Query #", + "database.refreshSchemas": "Refresh schemas", + "database.restore": "Restore #", + "database.restoreDatabaseBackup": "Restore database backup", + "database.shellDropAllObjects": "Shell: Drop all objects", + "database.shellRunScript": "Shell: Run script", + "database.shellTitle": "Shell #", + "database.showDiagram": "Show diagram", + "database.sqlGenerator": "SQL Generator", "error.driverNotFound": "Invalid database connection, driver not found", + "error.selectedCloudConnection": "Selected connection is from DbGate cloud", + "error.selectedNotCloudConnection": "Selected connection is not from DbGate cloud", + "file.allSupported": "All supported files", + "file.diagramFiles": "Diagram files", + "file.duckdb": "DuckDB database", + "file.jsonFiles": "JSON files", + "file.perspectiveFiles": "Perspective files", + "file.queryDesignerFiles": "Query designer files", + "file.sqlFiles": "SQL files", + "file.sqliteDatabase": "SQLite database", + "importExport.createZipFileInArchive": "Create ZIP file in archive", + "importExport.exportToZipArchive": "Output ZIP archive", + "importExport.exportToZipFile": "Export to ZIP file", + "importExport.importFromZipArchive": "Input ZIP archive", + "importExport.importFromZipFile": "Import from ZIP file (in archive folder)", "importExport.sourceFiles": "Source files", "importExport.tablesViewsCollections": "Tables / views / collections", "schema.add": "Add new schema", @@ -64,8 +117,111 @@ "schema.delete": "Delete schema", "schema.resetToDefault": "Reset to default", "schema.schemaName": "Schema name", - "settings.behaviour.jsonPreviewWrap": "Wrap json in preview", + "serverSummaryTab.databases": "Databases", + "serverSummaryTab.errorTitle": "Error loading server summary", + "serverSummaryTab.loadingMessage": "Loading server details", + "serverSummaryTab.processes": "Processes", + "serverSummaryTab.variables": "Variables", + "settings.appearance": "Application theme", + "settings.appearance.customSize": "Custom size", + "settings.appearance.editorTheme": "Theme", + "settings.appearance.editorTheme.default": "(use theme default)", + "settings.appearance.fontFamily": "Editor font family", + "settings.appearance.fontSize": "Font size", + "settings.appearance.moreThemes": "More themes are available as", + "settings.appearance.useSystemTheme": "Use system theme", + "settings.behaviour": "Behaviour", + "settings.behaviour.jsonPreviewWrap": "Wrap JSON in preview", + "settings.behaviour.openDetailOnArrows": "Open detail on keyboard navigation", + "settings.behaviour.useTabPreviewMode": "Use tab preview mode", + "settings.confirmations": "Confirmations", + "settings.confirmations.skipConfirm.collectionDataSave": "Skip confirmation when saving collection data (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Skip confirmation when saving table data (SQL)", + "settings.connection": "Connection", + "settings.connection.autoRefresh": "Automatic refresh of database model on background", + "settings.connection.autoRefreshInterval": "Interval between automatic DB structure reloads in seconds", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Show only tabs from selected database", + "settings.connection.sshBindHost": "Local host address for SSH connections", + "settings.dataGrid.alignNumbersRight": "Align numbers to right", + "settings.dataGrid.collectionPageSize": "Collection page size (for MongoDB JSON view, must be between 5 and 1000)", + "settings.dataGrid.coloringMode": "Row coloring mode", + "settings.dataGrid.coloringMode.2-primary": "Every 2-nd row, primary color", + "settings.dataGrid.coloringMode.2-secondary": "Every 2-nd row, secondary color", + "settings.dataGrid.coloringMode.36": "Every 3rd and 6th row", + "settings.dataGrid.coloringMode.none": "None", + "settings.dataGrid.defaultAutoRefreshInterval": "Default grid auto refresh interval in seconds", + "settings.dataGrid.pageSize": "Page size (number of rows for incremental loading, must be between 5 and 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Show all columns when searching", + "settings.dataGrid.showHintColumns": "Show foreign key hints", + "settings.dataGrid.thousandsSeparator": "Use thousands separator for numbers", + "settings.dataGrid.title": "Data grid", + "settings.defaultActions": "Default actions", + "settings.defaultActions.collectionClick": "NoSQL collection click", + "settings.defaultActions.connectionClick": "Connection click", + "settings.defaultActions.connectionClick.connect": "Connect", + "settings.defaultActions.connectionClick.none": "Do nothing", + "settings.defaultActions.connectionClick.openDetails": "Edit / open details", + "settings.defaultActions.databaseClick": "Database click", + "settings.defaultActions.databaseClick.none": "Do nothing", + "settings.defaultActions.databaseClick.switch": "Switch database", + "settings.defaultActions.functionClick": "Function click", + "settings.defaultActions.materializedViewClick": "Materialized view click", + "settings.defaultActions.procedureClick": "Procedure click", + "settings.defaultActions.tableClick": "Table click", + "settings.defaultActions.useLastUsedAction": "Use last used action", + "settings.defaultActions.viewClick": "View click", + "settings.editor.keybinds": "Editor keybinds", + "settings.editor.wordWrap": "Enable word wrap", + "settings.externalTools": "External tools", + "settings.general": "General", + "settings.license": "License", "settings.localization": "Localization", + "settings.localization.language": "Language", + "settings.localization.reloadWarning": "Application will be reloaded to apply new language settings", + "settings.nativeMenuRestartWarning": "Native menu settings will be applied after app restart", + "settings.other": "Other", + "settings.other.ai.allowSendModels": "Allow to send DB models and query snippets to AI service", + "settings.other.autoUpdateApplication": "Auto update application", + "settings.other.autoUpdateApplication.check": "Check for new versions", + "settings.other.autoUpdateApplication.download": "Check and download new versions", + "settings.other.autoUpdateApplication.skip": "Do not check for new versions", + "settings.other.externalTools.mysql": "mysql (restore MySQL database)", + "settings.other.externalTools.mysqlPlugins": "Folder with mysql plugins (for example for authentication). Set only in case of problems", + "settings.other.externalTools.mysqldump": "mysqldump (backup MySQL database)", + "settings.other.externalTools.pg_dump": "pg_dump (backup PostgreSQL database)", + "settings.other.externalTools.psql": "psql (restore PostgreSQL database)", + "settings.other.gistCreateToken": "API token for creating error gists", + "settings.other.license": "License", + "settings.other.licenseKey": "License key", + "settings.other.licenseKey.checkForNew": "Check for new license key", + "settings.other.licenseKey.expiration": "License key expiration:", + "settings.other.licenseKey.invalid": "License key is invalid", + "settings.other.licenseKey.valid": "License key is valid", + "settings.other.licenseKey.validTo": "License valid to:", + "settings.session": "Query sessions", + "settings.session.autoClose": "Automatic close query sessions after period without any activity", + "settings.session.autoCloseTimeout": "Interval, after which query session without activity is closed (in minutes)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Disable current line execution (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Disable split by empty line", + "settings.sqlEditor.limitRows": "Return only N rows from query", + "settings.sqlEditor.limitRowsPlaceholder": "(No rows limit)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Show table aliases in code completion", + "settings.sqlEditor.sqlCommandsCase": "SQL commands case", + "settings.tabGroup.showServerName": "Show server name alongside database name in title of the tab group", + "settings.theme": "Themes", + "settings.title": "Settings", + "summaryProcesses.actions": "Actions", + "summaryProcesses.client": "Client", + "summaryProcesses.connectionId": "Connection ID", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operation", + "summaryProcesses.processId": "Process ID", + "summaryProcesses.runningTime": "Running Time", + "summaryProcesses.state": "State", + "summaryProcesses.waitingFor": "Waiting For", + "summaryVariables.value": "Value", + "summaryVariables.variable": "Variable", "tab.administration": "Administration", "widget.databaseContent": "Database content", "widget.databases": "Databases", diff --git a/translations/sk.json b/translations/sk.json new file mode 100644 index 000000000..094b13546 --- /dev/null +++ b/translations/sk.json @@ -0,0 +1,231 @@ +{ + "app.databaseName": "Názov databázy", + "app.preparingPlugins": "Príprava pluginov...", + "app.starting": "Spúšťam DbGate", + "authToken": "Autentifikačný token", + "column.copyName": "Kopírovať názov", + "column.dropColumn": "Odstrániť stĺpec", + "column.renameColumn": "Premenovať stĺpec", + "command.datagrid.addNewColumn": "Pridať nový stĺpec", + "command.datagrid.addNewColumn.toolbar": "Nový stĺpec", + "command.datagrid.cloneRows": "Klonovať riadky", + "command.datagrid.cloneRows.toolbar": "Klonovať riadok(y)", + "command.datagrid.copyToClipboard": "Kopírovať do schránky", + "command.datagrid.deleteSelectedRows": "Odstrániť vybrané riadky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstrániť riadok(y)", + "command.datagrid.editJsonDocument": "Upraviť riadok ako JSON dokument", + "command.datagrid.insertNewRow": "Vložiť nový riadok", + "command.datagrid.insertNewRow.toolbar": "Nový riadok", + "command.datagrid.loadCellFromFile": "Načítať bunku zo súboru", + "command.datagrid.openJsonArrayInSheet": "Otvoriť pole ako tabuľku", + "command.datagrid.openSelectionInMap": "Otvoriť výber v mape", + "command.datagrid.reconnect": "Znovu pripojiť", + "command.datagrid.redo": "Znova", + "command.datagrid.removeField": "Odstrániť pole", + "command.datagrid.revertAllChanges": "Vrátiť všetky zmeny", + "command.datagrid.revertAllChanges.toolbar": "Vrátiť všetko", + "command.datagrid.revertRowChanges": "Vrátiť zmeny riadka", + "command.datagrid.saveCellToFile": "Uložiť bunku do súboru", + "command.datagrid.setNull": "Nastaviť NULL", + "command.datagrid.undo": "Krok späť", + "command.datagrid.viewJsonDocument": "Zobraziť riadok ako JSON dokument", + "command.datagrid.viewJsonValue": "Zobraziť bunku ako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáza", + "command.new.sqliteDatabase": "Nová SQLite databáza", + "command.tabs.addToFavorites": "Pridať aktuálnu kartu do obľúbených", + "command.tabs.closeAll": "Zavrieť všetky karty", + "command.tabs.closeTab": "Zavrieť kartu", + "command.tabs.closeTabsButCurrentDb": "Zavrieť karty okrem aktuálnej DB", + "command.tabs.closeTabsWithCurrentDb": "Zavrieť karty s aktuálnou DB", + "command.tabs.nextTab": "Ďalšia karta", + "command.tabs.previousTab": "Predchádzajúca karta", + "command.tabs.reopenClosedTab": "Znovu otvoriť zatvorenú kartu", + "common.archive": "Archivovať (JSONL)", + "common.close": "Zavrieť", + "common.connections": "Pripojenia", + "common.database": "Databáza", + "common.export": "Exportovať", + "common.import": "Importovať", + "common.kill": "Ukončiť", + "common.query": "Dotaz", + "common.refresh": "Obnoviť", + "common.save": "Uložiť", + "common.saveToArchive": "Uložiť do archívu", + "common.schema": "Schéma", + "connection.connect": "Pripojiť", + "connection.createDatabase": "Vytvoriť databázu", + "connection.databaseName": "Názov databázy", + "connection.delete": "Odstrániť", + "connection.disconnect": "Odpojiť", + "connection.duplicate": "Duplikovať", + "connection.edit": "Upraviť", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnoviť", + "connection.serverSummary": "Zhrnutie servera", + "connection.viewDetails": "Zobraziť detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnať", + "database.copyDatabaseName": "Kopírovať názov databázy", + "database.createDatabaseBackup": "Vytvoriť zálohu databázy", + "database.createNewApplication": "Vytvoriť novú aplikáciu", + "database.dataDeployer": "Nasadzovač dát", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektívneho dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojiť", + "database.dropDatabase": "Odstrániť databázu", + "database.editApplications": "Upraviť aplikáciu", + "database.export": "Exportovať", + "database.exportDbModel": "Exportovať DB model", + "database.generateScript": "Generovať skript", + "database.import": "Importovať", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabuľka", + "database.perspective": "Perspektíva #", + "database.profiler": "Profilovač", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnoviť schémy", + "database.restore": "Obnoviť #", + "database.restoreDatabaseBackup": "Obnoviť zálohu databázy", + "database.shellDropAllObjects": "Shell: Odstrániť všetky objekty", + "database.shellRunScript": "Shell: Spustiť skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobraziť", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné pripojenie k databáze, ovládač nenájdený", + "error.selectedCloudConnection": "Vybrané pripojenie je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané pripojenie nie je z DbGate cloudu", + "file.allSupported": "Všetky podporované súbory", + "file.diagramFiles": "Súbory diagramov", + "file.duckdb": "Databáza DuckDB", + "file.jsonFiles": "JSON súbory", + "file.perspectiveFiles": "Súbory perspektívy", + "file.queryDesignerFiles": "Súbory návrhu dotazu", + "file.sqlFiles": "SQL súbory", + "file.sqliteDatabase": "SQLite databáza", + "importExport.createZipFileInArchive": "Vytvoriť ZIP súbor v archíve", + "importExport.exportToZipArchive": "Exportovať do ZIP archívu", + "importExport.exportToZipFile": "Exportovať do ZIP súboru", + "importExport.importFromZipArchive": "Importovať zo ZIP archívu", + "importExport.importFromZipFile": "Importovať zo ZIP súboru (v archívnej zložke)", + "importExport.sourceFiles": "Zdrojové súbory", + "importExport.tablesViewsCollections": "Tabuľky / pohľady / kolekcie", + "schema.add": "Pridať novú schému", + "schema.createSchema": "Vytvoriť schému", + "schema.delete": "Odstrániť schému", + "schema.resetToDefault": "Resetovať na predvolené", + "schema.schemaName": "Názov schémy", + "serverSummaryTab.databases": "Databázy", + "serverSummaryTab.errorTitle": "Chyba pri načítaní zhrnutia servera", + "serverSummaryTab.loadingMessage": "Načítavanie detailov servera", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Premenné", + "settings.appearance": "Vzhľad aplikácie", + "settings.appearance.customSize": "Vlastná veľkosť", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použiť predvolenú tému)", + "settings.appearance.fontFamily": "Písmo editora", + "settings.appearance.fontSize": "Veľkosť písma", + "settings.appearance.moreThemes": "Viac tém je k dispozícii ako", + "settings.appearance.useSystemTheme": "Použiť systémovú tému", + "settings.behaviour": "Správanie", + "settings.behaviour.jsonPreviewWrap": "Zalomiť JSON v náhľade", + "settings.behaviour.openDetailOnArrows": "Otvoriť detail pri navigácii klávesnicou", + "settings.behaviour.useTabPreviewMode": "Použiť režim náhľadu na karte", + "settings.confirmations": "Potvrdenia", + "settings.confirmations.skipConfirm.collectionDataSave": "Preskočiť potvrdenie pri ukladaní údajov kolekcie (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Preskočiť potvrdenie pri ukladaní údajov tabuľky (SQL)", + "settings.connection": "Pripojenie", + "settings.connection.autoRefresh": "Automatické obnovenie modelu databázy na pozadí", + "settings.connection.autoRefreshInterval": "Interval medzi automatickým načítaním štruktúry DB (v sekundách)", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobraziť iba karty z vybranej databázy", + "settings.connection.sshBindHost": "Adresa localhostu pre SSH pripojenia", + "settings.dataGrid.alignNumbersRight": "Zarovnať čísla doprava", + "settings.dataGrid.collectionPageSize": "Veľkosť stránky kolekcie (pre JSON zobrazenie MongoDB, musí byť medzi 5 a 1000)", + "settings.dataGrid.coloringMode": "Režim farbenia riadkov", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. riadok, primárna farba", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. riadok, sekundárna farba", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. riadok", + "settings.dataGrid.coloringMode.none": "Žiadne", + "settings.dataGrid.defaultAutoRefreshInterval": "Predvolený interval automatického obnovenia mriežky v sekundách", + "settings.dataGrid.pageSize": "Veľkosť stránky (počet riadkov pre inkrementálne načítanie, musí byť medzi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobraziť všetky stĺpce pri vyhľadávaní", + "settings.dataGrid.showHintColumns": "Zobraziť nápovedy pre cudzie kľúče", + "settings.dataGrid.thousandsSeparator": "Použiť oddeľovač tisícov pre čísla", + "settings.dataGrid.title": "Mriežka údajov", + "settings.defaultActions": "Predvolené akcie", + "settings.defaultActions.collectionClick": "Kliknutie na kolekciu NoSQL", + "settings.defaultActions.connectionClick": "Kliknutie na pripojenie", + "settings.defaultActions.connectionClick.connect": "Pripojiť", + "settings.defaultActions.connectionClick.none": "Nevykonať nič", + "settings.defaultActions.connectionClick.openDetails": "Upraviť / otvoriť detaily", + "settings.defaultActions.databaseClick": "Kliknutie na databázu", + "settings.defaultActions.databaseClick.none": "Nevykonať nič", + "settings.defaultActions.databaseClick.switch": "Prepnúť databázu", + "settings.defaultActions.functionClick": "Kliknutie na funkciu", + "settings.defaultActions.materializedViewClick": "Kliknutie na materializovaný pohľad", + "settings.defaultActions.procedureClick": "Kliknutie na procedúru", + "settings.defaultActions.tableClick": "Kliknutie na tabuľku", + "settings.defaultActions.useLastUsedAction": "Použiť naposledy použitú akciu", + "settings.defaultActions.viewClick": "Kliknutie na pohľad", + "settings.editor.keybinds": "Klávesové skratky editora", + "settings.editor.wordWrap": "Povoliť zalomovanie riadkov", + "settings.externalTools": "Externé nástroje", + "settings.general": "Všeobecné", + "settings.license": "Licencia", + "settings.localization": "Lokalizácia", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikácia musí byť reštartovaná, aby sa zmenil jazyk", + "settings.nativeMenuRestartWarning": "Nastavenie natívnej ponuky vyžaduje reštart aplikácie", + "settings.other": "Ostatné", + "settings.other.ai.allowSendModels": "Povoliť odosielanie modelov DB a fragmentov dotazov do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovať aplikáciu", + "settings.other.autoUpdateApplication.check": "Skontrolovať nové verzie", + "settings.other.autoUpdateApplication.download": "Skontrolovať a stiahnuť nové verzie", + "settings.other.autoUpdateApplication.skip": "Nekontrolovať nové verzie", + "settings.other.externalTools.mysql": "mysql (obnovenie databázy MySQL)", + "settings.other.externalTools.mysqlPlugins": "Priečinok s pluginmi MySQL (napríklad pre autentifikáciu). Nastaviť iba v prípade problémov", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databázy MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databázy PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovenie databázy PostgreSQL)", + "settings.other.gistCreateToken": "API token pre vytváranie chybových gistov", + "settings.other.license": "Licencia", + "settings.other.licenseKey": "Licenčný kľúč", + "settings.other.licenseKey.checkForNew": "Overiť nový licenčný kľúč", + "settings.other.licenseKey.expiration": "Expirácia licencie:", + "settings.other.licenseKey.invalid": "Licenčný kľúč je neplatný", + "settings.other.licenseKey.valid": "Licenčný kľúč je platný", + "settings.other.licenseKey.validTo": "Licencia platná do:", + "settings.session": "Dotazové relácie", + "settings.session.autoClose": "Automaticky zatvoriť relácie dotazov po čase nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po ktorom sa relácia dotazov bez aktivity zatvorí (v minútach)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázať vykonanie aktuálneho riadku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázať rozdelenie prázdnym riadkom", + "settings.sqlEditor.limitRows": "Vrátiť iba N riadkov z dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobraziť aliasy tabuliek v automatickom doplňovaní", + "settings.sqlEditor.sqlCommandsCase": "Veľkosť písmen", + "settings.tabGroup.showServerName": "Zobraziť názov servera vedľa názvu databázy v názve skupiny kariet", + "settings.theme": "Vzhľad", + "settings.title": "Nastavenia", + "summaryProcesses.actions": "Akcie", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID pripojenia", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operácia", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas behu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čaká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Premenná", + "tab.administration": "Administrácia", + "widget.databaseContent": "Obsah databázy", + "widget.databases": "Databázy", + "widget.keys": "Kľúče", + "widget.pinned": "Pripnuté", + "widget.tablesViewsFunctions": "Tabuľky, pohľady, funkcie" +} \ No newline at end of file From 0e211dc91b273f988ef73fa0290f3a39f82d36e8 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 15:04:04 +0100 Subject: [PATCH 027/124] translation-connections,sqlObject,column,filter --- .../web/src/appobj/ConnectionAppObject.svelte | 2 +- packages/web/src/commands/stdCommands.ts | 4 +- .../web/src/datagrid/ColumnManager.svelte | 11 +- .../web/src/datagrid/DataFilterControl.svelte | 87 +++++----- packages/web/src/modals/InputTextModal.svelte | 3 +- packages/web/src/modals/SetFilterModal.svelte | 11 +- .../src/modals/SetFilterModal_Select.svelte | 43 ++--- .../ConnectionAdvancedDriverFields.svelte | 5 +- .../settings/ConnectionDriverFields.svelte | 84 +++++----- .../settings/ConnectionSshTunnelFields.svelte | 19 +-- .../src/settings/ConnectionSslFields.svelte | 13 +- .../web/src/widgets/ConnectionList.svelte | 23 +-- packages/web/src/widgets/SqlObjectList.svelte | 35 ++-- translations/cs.json | 149 +++++++++++++++++- translations/en.json | 149 +++++++++++++++++- translations/sk.json | 149 +++++++++++++++++- 16 files changed, 619 insertions(+), 168 deletions(-) diff --git a/packages/web/src/appobj/ConnectionAppObject.svelte b/packages/web/src/appobj/ConnectionAppObject.svelte index d99ccaf2a..afdaa91e5 100644 --- a/packages/web/src/appobj/ConnectionAppObject.svelte +++ b/packages/web/src/appobj/ConnectionAppObject.svelte @@ -279,7 +279,7 @@ showModal(InputTextModal, { header: _t('connection.createDatabase', { defaultMessage: 'Create database' }), value: 'newdb', - label: _t('connection.databaseName', { defaultMessage: 'Database name' }), + label: _t('connection.database', { defaultMessage: 'Database name' }), onConfirm: name => apiCall('server-connections/create-database', { conid: data._id, diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index f2f3872d6..b912b5846 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -161,8 +161,8 @@ registerCommand({ onClick: () => { showModal(InputTextModal, { value: '', - label: 'New connection folder name', - header: 'Create connection folder', + label: _t('connection.createNewFolderName', { defaultMessage: 'New connection folder name' }), + header: _t('connection.createNewFolder', { defaultMessage: 'Create connection folder' }), onConfirm: async folder => { emptyConnectionGroupNames.update(names => { if (!folder) return names; diff --git a/packages/web/src/datagrid/ColumnManager.svelte b/packages/web/src/datagrid/ColumnManager.svelte index fbc024457..573df7ea9 100644 --- a/packages/web/src/datagrid/ColumnManager.svelte +++ b/packages/web/src/datagrid/ColumnManager.svelte @@ -17,6 +17,7 @@ import SelectField from '../forms/SelectField.svelte'; import ColumnEditorModal from '../tableeditor/ColumnEditorModal.svelte'; import { tick } from 'svelte'; + import { _t } from '../translations'; export let managerSize; export let display: GridDisplay; @@ -154,8 +155,8 @@ class="colmode" value={isDynamicStructure ? 'variable' : 'fixed'} options={[ - { label: 'Fixed columns (like SQL)', value: 'fixed' }, - { label: 'Variable columns (like MongoDB)', value: 'variable' }, + { label: _t('column.fixed', {defaultMessage: 'Fixed columns (like SQL)'}), value: 'fixed' }, + { label: _t('column.variable', {defaultMessage: 'Variable columns (like MongoDB)'}) , value: 'variable' }, ]} on:change={e => { dispatchChangeSet({ @@ -175,7 +176,7 @@ {/if} display.setSearchInColumns(value)} data-testid="ColumnManager_searchColumns" @@ -186,8 +187,8 @@ on:click={() => { showModal(InputTextModal, { value: '', - label: 'Column name', - header: 'Add new column', + label: _t('column.name', {defaultMessage: 'Column name'}), + header: _t('column.addNew', {defaultMessage: 'Add new column'}), onConfirm: name => { display.addDynamicColumn(name); tick().then(() => { diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 9508de601..7f2a5025a 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -17,6 +17,7 @@ import FontIcon from '../icons/FontIcon.svelte'; import DictionaryLookupModal from '../modals/DictionaryLookupModal.svelte'; import ValueLookupModal from '../modals/ValueLookupModal.svelte'; + import { _t } from '../translations'; export let isReadOnly = false; export let filterBehaviour; @@ -64,43 +65,43 @@ function createMenu() { const res = [ - { onClick: () => setFilter(''), text: 'Clear Filter' }, - { onClick: () => filterMultipleValues(), text: 'Filter multiple values' }, + { onClick: () => setFilter(''), text: _t('filter.clear', { defaultMessage: 'Clear Filter' }) }, + { onClick: () => filterMultipleValues(), text: _t('filter.multipleValues', { defaultMessage: 'Filter multiple values' }) }, ]; if (filterBehaviour.supportEquals) { res.push( - { onClick: () => openFilterWindow('='), text: 'Equals...' }, - { onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' } + { onClick: () => openFilterWindow('='), text: _t('filter.equals', { defaultMessage: 'Equals...' }) }, + { onClick: () => openFilterWindow('<>'), text: _t('filter.doesNotEqual', { defaultMessage: 'Does Not Equal...' }) } ); } if (filterBehaviour.supportExistsTesting) { res.push( - { onClick: () => setFilter('EXISTS'), text: 'Field exists' }, - { onClick: () => setFilter('NOT EXISTS'), text: 'Field does not exist' } + { onClick: () => setFilter('EXISTS'), text: _t('filter.fieldExists', { defaultMessage: 'Field exists' }) }, + { onClick: () => setFilter('NOT EXISTS'), text: _t('filter.fieldDoesNotExist', { defaultMessage: 'Field does not exist' }) } ); } if (filterBehaviour.supportNotEmptyArrayTesting) { - res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: 'Array is not empty' }); + res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: _t('filter.arrayIsNotEmpty', { defaultMessage: 'Array is not empty' }) }); } if (filterBehaviour.supportEmptyArrayTesting) { - res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: 'Array is empty' }); + res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: _t('filter.arrayIsEmpty', { defaultMessage: 'Array is empty' }) }); } if (filterBehaviour.supportNullTesting) { res.push( - { onClick: () => setFilter('NULL'), text: 'Is Null' }, - { onClick: () => setFilter('NOT NULL'), text: 'Is Not Null' } + { onClick: () => setFilter('NULL'), text: _t('filter.isNull', { defaultMessage: 'Is Null' }) }, + { onClick: () => setFilter('NOT NULL'), text: _t('filter.isNotNull', { defaultMessage: 'Is Not Null' }) } ); } if (filterBehaviour.supportEmpty) { res.push( - { onClick: () => setFilter('EMPTY, NULL'), text: 'Is Empty Or Null' }, - { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: 'Has Not Empty Value' } + { onClick: () => setFilter('EMPTY, NULL'), text: _t('filter.isEmptyOrNull', { defaultMessage: 'Is Empty Or Null' }) }, + { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: _t('filter.hasNotEmptyValue', { defaultMessage: 'Has Not Empty Value' }) } ); } @@ -108,10 +109,10 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('>'), text: 'Greater Than...' }, - { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, - { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, - { onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' } + { onClick: () => openFilterWindow('>'), text: _t('filter.greaterThan', { defaultMessage: 'Greater Than...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.greaterThanOrEqualTo', { defaultMessage: 'Greater Than Or Equal To...' }) }, + { onClick: () => openFilterWindow('<'), text: _t('filter.lessThan', { defaultMessage: 'Less Than...' }) }, + { onClick: () => openFilterWindow('<='), text: _t('filter.lessThanOrEqualTo', { defaultMessage: 'Less Than Or Equal To...' }) } ); } @@ -119,26 +120,26 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('+'), text: 'Contains...' }, - { onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' }, - { onClick: () => openFilterWindow('^'), text: 'Begins With...' }, - { onClick: () => openFilterWindow('!^'), text: 'Does Not Begin With...' }, - { onClick: () => openFilterWindow('$'), text: 'Ends With...' }, - { onClick: () => openFilterWindow('!$'), text: 'Does Not End With...' } + { onClick: () => openFilterWindow('+'), text: _t('filter.contains', { defaultMessage: 'Contains...' }) }, + { onClick: () => openFilterWindow('~'), text: _t('filter.doesNotContain', { defaultMessage: 'Does Not Contain...' }) }, + { onClick: () => openFilterWindow('^'), text: _t('filter.beginsWith', { defaultMessage: 'Begins With...' }) }, + { onClick: () => openFilterWindow('!^'), text: _t('filter.doesNotBeginWith', { defaultMessage: 'Does Not Begin With...' }) }, + { onClick: () => openFilterWindow('$'), text: _t('filter.endsWith', { defaultMessage: 'Ends With...' }) }, + { onClick: () => openFilterWindow('!$'), text: _t('filter.doesNotEndWith', { defaultMessage: 'Does Not End With...' }) } ); } if (filterBehaviour.supportBooleanValues) { res.push( - { onClick: () => setFilter('TRUE'), text: 'Is True' }, - { onClick: () => setFilter('FALSE'), text: 'Is False' } + { onClick: () => setFilter('TRUE'), text: _t('filter.isTrue', { defaultMessage: 'Is True' }) }, + { onClick: () => setFilter('FALSE'), text: _t('filter.isFalse', { defaultMessage: 'Is False' }) } ); } if (filterBehaviour.supportBooleanOrNull) { res.push( - { onClick: () => setFilter('TRUE, NULL'), text: 'Is True or NULL' }, - { onClick: () => setFilter('FALSE, NULL'), text: 'Is False or NULL' } + { onClick: () => setFilter('TRUE, NULL'), text: _t('filter.isTrueOrNull', { defaultMessage: 'Is True or NULL' }) }, + { onClick: () => setFilter('FALSE, NULL'), text: _t('filter.isFalseOrNull', { defaultMessage: 'Is False or NULL' }) } ); } @@ -146,44 +147,44 @@ res.push( { divider: true }, - { onClick: () => setFilter('TOMORROW'), text: 'Tomorrow' }, - { onClick: () => setFilter('TODAY'), text: 'Today' }, - { onClick: () => setFilter('YESTERDAY'), text: 'Yesterday' }, + { onClick: () => setFilter('TOMORROW'), text: _t('filter.tomorrow', { defaultMessage: 'Tomorrow' }) }, + { onClick: () => setFilter('TODAY'), text: _t('filter.today', { defaultMessage: 'Today' }) }, + { onClick: () => setFilter('YESTERDAY'), text: _t('filter.yesterday', { defaultMessage: 'Yesterday' }) }, { divider: true }, - { onClick: () => setFilter('NEXT WEEK'), text: 'Next Week' }, - { onClick: () => setFilter('THIS WEEK'), text: 'This Week' }, - { onClick: () => setFilter('LAST WEEK'), text: 'Last Week' }, + { onClick: () => setFilter('NEXT WEEK'), text: _t('filter.nextWeek', { defaultMessage: 'Next Week' }) }, + { onClick: () => setFilter('THIS WEEK'), text: _t('filter.thisWeek', { defaultMessage: 'This Week' }) }, + { onClick: () => setFilter('LAST WEEK'), text: _t('filter.lastWeek', { defaultMessage: 'Last Week' }) }, { divider: true }, - { onClick: () => setFilter('NEXT MONTH'), text: 'Next Month' }, - { onClick: () => setFilter('THIS MONTH'), text: 'This Month' }, - { onClick: () => setFilter('LAST MONTH'), text: 'Last Month' }, + { onClick: () => setFilter('NEXT MONTH'), text: _t('filter.nextMonth', { defaultMessage: 'Next Month' }) }, + { onClick: () => setFilter('THIS MONTH'), text: _t('filter.thisMonth', { defaultMessage: 'This Month' }) }, + { onClick: () => setFilter('LAST MONTH'), text: _t('filter.lastMonth', { defaultMessage: 'Last Month' }) }, { divider: true }, - { onClick: () => setFilter('NEXT YEAR'), text: 'Next Year' }, - { onClick: () => setFilter('THIS YEAR'), text: 'This Year' }, - { onClick: () => setFilter('LAST YEAR'), text: 'Last Year' } + { onClick: () => setFilter('NEXT YEAR'), text: _t('filter.nextYear', { defaultMessage: 'Next Year' }) }, + { onClick: () => setFilter('THIS YEAR'), text: _t('filter.thisYear', { defaultMessage: 'This Year' }) }, + { onClick: () => setFilter('LAST YEAR'), text: _t('filter.lastYear', { defaultMessage: 'Last Year' }) } ); } if (filterBehaviour.supportDatetimeComparison) { res.push( { divider: true }, - { onClick: () => openFilterWindow('<='), text: 'Before...' }, - { onClick: () => openFilterWindow('>='), text: 'After...' }, - { onClick: () => openFilterWindow('>=;<='), text: 'Between...' } + { onClick: () => openFilterWindow('<='), text: _t('filter.before', { defaultMessage: 'Before...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.after', { defaultMessage: 'After...' }) }, + { onClick: () => openFilterWindow('>=;<='), text: _t('filter.between', { defaultMessage: 'Between...' }) } ); } if (filterBehaviour.supportSqlCondition) { res.push( { divider: true }, - { onClick: () => openFilterWindow('sql'), text: 'SQL condition ...' }, - { onClick: () => openFilterWindow('sqlRight'), text: 'SQL condition - right side ...' } + { onClick: () => openFilterWindow('sql'), text: _t('filter.sqlCondition', { defaultMessage: 'SQL condition ...' }) }, + { onClick: () => openFilterWindow('sqlRight'), text: _t('filter.sqlConditionRight', { defaultMessage: 'SQL condition - right side ...' }) } ); } diff --git a/packages/web/src/modals/InputTextModal.svelte b/packages/web/src/modals/InputTextModal.svelte index 7ce64667e..22dbd1545 100644 --- a/packages/web/src/modals/InputTextModal.svelte +++ b/packages/web/src/modals/InputTextModal.svelte @@ -6,6 +6,7 @@ import FormTextField from '../forms/FormTextField.svelte'; import ModalBase from './ModalBase.svelte'; import { closeCurrentModal } from './modalTools'; + import { _t } from '../translations'; export let header; export let value; @@ -29,7 +30,7 @@ handleSubmit(e.detail)} data-testid="InputTextModal_ok" /> - + diff --git a/packages/web/src/modals/SetFilterModal.svelte b/packages/web/src/modals/SetFilterModal.svelte index 436d734ff..38e224852 100644 --- a/packages/web/src/modals/SetFilterModal.svelte +++ b/packages/web/src/modals/SetFilterModal.svelte @@ -10,6 +10,7 @@ import { closeCurrentModal } from './modalTools'; import FormRadioGroupItem from '../forms/FormRadioGroupItem.svelte'; import FormValues from '../forms/FormValues.svelte'; + import { _t } from '../translations'; export let condition1; export let onFilter; @@ -44,10 +45,10 @@ -
Set filter
+
{_t('filter.setFilter', {defaultMessage: 'Set filter'})}
-
Show rows where
+
{_t('filter.showRowsWhere', {defaultMessage: 'Show rows where'})}
@@ -62,9 +63,9 @@
- + {#if !filterBehaviour.disableOr} - + {/if}
@@ -84,7 +85,7 @@
- +
diff --git a/packages/web/src/modals/SetFilterModal_Select.svelte b/packages/web/src/modals/SetFilterModal_Select.svelte index dd4b54b15..2f0ffee8d 100644 --- a/packages/web/src/modals/SetFilterModal_Select.svelte +++ b/packages/web/src/modals/SetFilterModal_Select.svelte @@ -1,56 +1,57 @@ - - + + {#if advancedFields} diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 32076ef62..5933239a5 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -87,13 +87,13 @@ !driver.isElectronOnly || electron) @@ -109,7 +109,7 @@ {#if $authTypes && driver?.showConnectionField('authType', $values, showConnectionFieldArgs) && driver?.authTypeFirst} {#key $authTypes} {:else} @@ -164,8 +164,8 @@ name="useDatabaseUrl" matchValueToOption={(value, option) => !!option.value == !!value} options={[ - { label: 'Fill database connection details', value: '', default: true }, - { label: 'Use database URL', value: '1' }, + { label: _t('connection.fillDetails', { defaultMessage: 'Fill database connection details' }), value: '', default: true }, + { label: _t('connection.useUrl', { defaultMessage: 'Use database URL' }), value: '1' }, ]} />
@@ -173,7 +173,7 @@ {#if driver?.showConnectionField('databaseUrl', $values, showConnectionFieldArgs)}
- Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead + { _t('connection.dockerWarning', { defaultMessage: 'Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead' }) }
{/if} {/if} @@ -280,7 +280,7 @@
@@ -418,7 +418,7 @@ {#if driver?.showConnectionField('treeKeySeparator', $values, showConnectionFieldArgs)} + {/if} {#if driver}
{#if electron} {:else}
{#if $platformInfo && $platformInfo.sshAuthSock} - SSH Agent found + {_t('connection.sshTunnel.agentFound', {defaultMessage: "SSH Agent found"})} {:else} - SSH Agent not found + {_t('connection.sshTunnel.agentNotFound', {defaultMessage: "SSH Agent not found"})} {/if}
{/if} diff --git a/packages/web/src/settings/ConnectionSslFields.svelte b/packages/web/src/settings/ConnectionSslFields.svelte index 24936f42f..a50928458 100644 --- a/packages/web/src/settings/ConnectionSslFields.svelte +++ b/packages/web/src/settings/ConnectionSslFields.svelte @@ -7,6 +7,7 @@ import getElectron from '../utility/getElectron'; import FormPasswordField from '../forms/FormPasswordField.svelte'; import { openedConnections, openedSingleDatabaseConnections } from '../stores'; + import { _t } from '../translations'; const { values, setFieldValue } = getFormContext(); const electron = getElectron(); @@ -15,21 +16,21 @@ $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); - - + + - + diff --git a/packages/web/src/widgets/ConnectionList.svelte b/packages/web/src/widgets/ConnectionList.svelte index 0e9227335..01808473c 100644 --- a/packages/web/src/widgets/ConnectionList.svelte +++ b/packages/web/src/widgets/ConnectionList.svelte @@ -47,6 +47,7 @@ getOpenDetailOnArrowsSettings, } from '../settings/settingsTools'; import DropDownButton from '../buttons/DropDownButton.svelte'; + import { _t } from '../translations'; const connections = useConnectionList(); const serverStatus = useServerStatus(); @@ -58,7 +59,7 @@ let domContainer = null; let domFilter = null; - const RECENT_AND_UNSAVED_LABEL = 'Recent & unsaved'; + const RECENT_AND_UNSAVED_LABEL = _t('connection.recentUnsaved', { defaultMessage: 'Recent & unsaved' }); function extractConnectionParent(data, openedConnections, openedSingleDatabaseConnections) { if (data.parent) { @@ -193,12 +194,12 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); - res.push({ label: 'Display name', switchValue: 'displayName' }); - res.push({ label: 'Server', switchValue: 'server' }); - res.push({ label: 'User', switchValue: 'user' }); - res.push({ label: 'Database engine', switchValue: 'engine' }); - res.push({ label: 'Database name', switchValue: 'database' }); + res.push({ label: _t('common.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); + res.push({ label: _t('connection.displayName', { defaultMessage: 'Display name' }), switchValue: 'displayName' }); + res.push({ label: _t('connection.server', { defaultMessage: 'Server' }), switchValue: 'server' }); + res.push({ label: _t('connection.user', { defaultMessage: 'User' }), switchValue: 'user' }); + res.push({ label: _t('connection.engine', { defaultMessage: 'Database engine' }), switchValue: 'engine' }); + res.push({ label: _t('connection.database', { defaultMessage: 'Database name' }), switchValue: 'database' }); return res.map(item => ({ ...item, switchStore: connectionAppObjectSearchSettings, @@ -209,7 +210,7 @@ { @@ -227,16 +228,16 @@ {#if $commandsCustomized['new.connection']?.enabled} runCommand('new.connection')} - title="Add new connection" + title={_t('connection.new.title', { defaultMessage: 'Add new connection' })} data-testid="ConnectionList_buttonNewConnection" > - runCommand('new.connection.folder')} title="Add new connection folder"> + runCommand('new.connection.folder')} title={_t('connection.new.folder.title', { defaultMessage: 'Add new connection folder' })}> {/if} - + diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 96de61bcd..fbafef8a2 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -56,6 +56,7 @@ import FocusedConnectionInfoWidget from './FocusedConnectionInfoWidget.svelte'; import SubProcedureParamList from '../appobj/SubProcedureParamList.svelte'; import SubProcedureLineList from '../appobj/SubProcedureLineList.svelte'; + import { _t } from '../translations'; export let conid; export let database; @@ -130,20 +131,20 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); + res.push({ label: _t('sqlObject.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); if (driver?.databaseEngineTypes?.includes('document')) { - res.push({ label: 'Collection name', switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.collectionName', { defaultMessage: 'Collection name' }), switchValue: 'pureName' }); } if (driver?.databaseEngineTypes?.includes('sql')) { - res.push({ label: 'Table/view/procedure name', switchValue: 'pureName' }); - res.push({ label: 'Schema', switchValue: 'schemaName' }); - res.push({ label: 'Column name', switchValue: 'columnName' }); - res.push({ label: 'Column data type', switchValue: 'columnDataType' }); - res.push({ label: 'Table comment', switchValue: 'tableComment' }); - res.push({ label: 'Column comment', switchValue: 'columnComment' }); - res.push({ label: 'View/procedure/trigger text', switchValue: 'sqlObjectText' }); - res.push({ label: 'Table engine', switchValue: 'tableEngine' }); - res.push({ label: 'Only tables with rows', switchValue: 'tablesWithRows' }); + res.push({ label: _t('sqlObject.tableViewProcedureName', { defaultMessage: 'Table/view/procedure name' }), switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.schemaName', { defaultMessage: 'Schema' }), switchValue: 'schemaName' }); + res.push({ label: _t('sqlObject.columnName', { defaultMessage: 'Column name' }), switchValue: 'columnName' }); + res.push({ label: _t('sqlObject.columnDataType', { defaultMessage: 'Column data type' }), switchValue: 'columnDataType' }); + res.push({ label: _t('sqlObject.tableComment', { defaultMessage: 'Table comment' }), switchValue: 'tableComment' }); + res.push({ label: _t('sqlObject.columnComment', { defaultMessage: 'Column comment' }), switchValue: 'columnComment' }); + res.push({ label: _t('sqlObject.viewProcedureTriggerText', { defaultMessage: 'View/procedure/trigger text' }), switchValue: 'sqlObjectText' }); + res.push({ label: _t('sqlObject.tableEngine', { defaultMessage: 'Table engine' }), switchValue: 'tableEngine' }); + res.push({ label: _t('sqlObject.tablesWithRows', { defaultMessage: 'Only tables with rows' }), switchValue: 'tablesWithRows' }); } return res.map(item => ({ ...item, @@ -175,7 +176,7 @@ - Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {:else if objectList.length == 0 && $status && $status.name != 'pending' && $status.name != 'checkStructure' && $status.name != 'loadStructure' && $objects}
- Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {#if driver?.databaseEngineTypes?.includes('sql')}
- runCommand('new.table')}>New table + runCommand('new.table')}>{_t('database.newTable', { defaultMessage: 'New table' })} {/if} {#if driver?.databaseEngineTypes?.includes('document')}
@@ -211,7 +212,7 @@ {:else} { @@ -259,7 +260,7 @@ data-testid="SqlObjectList_container" > {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects} - + {:else} Date: Thu, 30 Oct 2025 08:47:55 +0100 Subject: [PATCH 028/124] azure code signing --- workflow-templates/build-app.tpl.yaml | 55 ++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/workflow-templates/build-app.tpl.yaml b/workflow-templates/build-app.tpl.yaml index bfdd0bb55..35aa4049d 100644 --- a/workflow-templates/build-app.tpl.yaml +++ b/workflow-templates/build-app.tpl.yaml @@ -85,9 +85,14 @@ on: # branches: # - production +permissions: + id-token: write + contents: write + jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false @@ -145,33 +150,65 @@ jobs: _if: _community if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + + - name: Publish Windows + if: matrix.os == 'windows-2022' run: | <> yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} - # WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} - # WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} - + - name: Publish MacOS + if: matrix.os == 'macos-14' + run: | + <> + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} - APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + <> + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: generatePadFile _if: _community_stable run: | yarn generatePadFile + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + + files-folder: app/dist + files-folder-filter: exe + + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 + - name: Copy artifacts run: | mkdir artifacts From 32729350f6e38c41c708cae005821df7f454e438 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 07:48:22 +0000 Subject: [PATCH 029/124] chore: auto-update github workflows --- .github/workflows/build-app-beta.yaml | 43 +++++++++++++++++++-- .github/workflows/build-app-check.yaml | 43 +++++++++++++++++++-- .github/workflows/build-app-pro-beta.yaml | 47 +++++++++++++++++++++-- .github/workflows/build-app-pro.yaml | 47 +++++++++++++++++++++-- .github/workflows/build-app.yaml | 43 +++++++++++++++++++-- 5 files changed, 203 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index ca9df362f..d9003cafa 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -6,9 +6,13 @@ name: Electron app BETA push: tags: - v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -60,21 +64,52 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-check.yaml b/.github/workflows/build-app-check.yaml index c5686419e..112dca034 100644 --- a/.github/workflows/build-app-check.yaml +++ b/.github/workflows/build-app-check.yaml @@ -6,9 +6,13 @@ name: Electron app check build push: tags: - check-[0-9]+-[0-9]+-[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -56,21 +60,52 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 4f1cd8591..2ae47f81b 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -6,9 +6,13 @@ name: Electron app PREMIUM BETA push: tags: - v[0-9]+.[0-9]+.[0-9]+-premium-beta.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -87,7 +91,17 @@ jobs: cd dbgate-merged yarn fillPackagedPlugins - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | cd .. cd dbgate-merged @@ -95,15 +109,40 @@ jobs: yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index 6ad30d299..a26e343ae 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -6,9 +6,13 @@ name: Electron app PREMIUM push: tags: - v[0-9]+.[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -87,7 +91,17 @@ jobs: cd dbgate-merged yarn fillPackagedPlugins - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | cd .. cd dbgate-merged @@ -95,15 +109,40 @@ jobs: yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 22545dd62..00cb951c5 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -6,9 +6,13 @@ name: Electron app push: tags: - v[0-9]+.[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -56,24 +60,55 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: generatePadFile run: | yarn generatePadFile + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts From f24caad99714b95c0b89319b28e04ab0f29148e3 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 08:49:48 +0100 Subject: [PATCH 030/124] v6.6.8-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4861194d2..5b29fbcd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7", + "version": "6.6.8-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From 70284ac440547650542879919822879fd9a54165 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Thu, 30 Oct 2025 10:12:32 +0100 Subject: [PATCH 031/124] translation-datagrid,filter,macros,newObject --- .../web/src/buttons/NewObjectButton.svelte | 3 +- packages/web/src/datagrid/DataGrid.svelte | 9 +- .../web/src/datagrid/ReferenceManager.svelte | 6 +- .../web/src/formview/FormViewFilters.svelte | 3 +- packages/web/src/macro/MacroDetail.svelte | 3 +- packages/web/src/macro/MacroHeader.svelte | 5 +- packages/web/src/macro/MacroInfoTab.svelte | 11 +- packages/web/src/macro/MacroManager.svelte | 3 +- packages/web/src/macro/macros.js | 116 +++++++++--------- packages/web/src/modals/NewObjectModal.svelte | 65 +++++----- .../settings/ConnectionDriverFields.svelte | 4 +- translations/cs.json | 104 +++++++++++++++- translations/en.json | 102 +++++++++++++++ translations/sk.json | 102 +++++++++++++++ 14 files changed, 427 insertions(+), 109 deletions(-) diff --git a/packages/web/src/buttons/NewObjectButton.svelte b/packages/web/src/buttons/NewObjectButton.svelte index 61d6bb5cd..17fd1944e 100644 --- a/packages/web/src/buttons/NewObjectButton.svelte +++ b/packages/web/src/buttons/NewObjectButton.svelte @@ -1,6 +1,7 @@ - + {#if foreignKeys.length > 0} -
References tables ({foreignKeys.length})
+
{_t('dataGrid.referencesTables', { defaultMessage: 'References tables' })} ({foreignKeys.length})
{#each foreignKeys.filter(fk => filterName(filter, fk.refTableName)) as fk}