Compare commits

...

44 Commits

Author SHA1 Message Date
Stela Augustinova f11c4881f3 Update gitinore 2025-11-25 16:08:36 +01:00
Stela Augustinova 6398c6d7ce Added new translations 2025-11-25 16:03:55 +01:00
Stela Augustinova 973ce8c3a7 Load OpenAI API key 2025-11-25 16:02:44 +01:00
Stela Augustinova fe7b0e2bc7 Add translation script using OpenAI for missing keys (not finished) 2025-11-25 14:38:23 +01:00
CI workflows 0d82fd51c7 chore: auto-update github workflows 2025-11-25 08:21:06 +00:00
CI workflows 3b4d905485 Update pro ref 2025-11-25 08:20:50 +00:00
SPRINX0\prochazka 53c63f0f4b SYNC: diagrams supported in team files 2025-11-25 08:20:39 +00:00
SPRINX0\prochazka 5553e3cd8d SYNC: Handle error when saving to team files 2025-11-24 16:35:08 +00:00
SPRINX0\prochazka 67ee130a9e japanese localization 2025-11-24 16:20:59 +01:00
CI workflows 18d908fa63 chore: auto-update github workflows 2025-11-24 14:40:35 +00:00
CI workflows c61f58854e Update pro ref 2025-11-24 14:40:16 +00:00
SPRINX0\prochazka f789ecd2f1 SYNC: japanese settings 2025-11-24 14:40:04 +00:00
CI workflows 1fdc30804a chore: auto-update github workflows 2025-11-24 14:31:03 +00:00
CI workflows 5ba10d0acb Update pro ref 2025-11-24 14:30:50 +00:00
SPRINX0\prochazka 12803d8154 SYNC: admin settings 2025-11-24 14:30:38 +00:00
CI workflows 36c391ccff chore: auto-update github workflows 2025-11-24 14:27:45 +00:00
CI workflows 765fb6297c Update pro ref 2025-11-24 14:27:06 +00:00
SPRINX0\prochazka 66255769ad SYNC: support for browser default language 2025-11-24 14:26:54 +00:00
CI workflows 04a8d38641 chore: auto-update github workflows 2025-11-24 14:20:00 +00:00
CI workflows 859d020031 Update pro ref 2025-11-24 14:19:44 +00:00
SPRINX0\prochazka 3c541117d0 SYNC: change language for Team Premium 2025-11-24 14:19:33 +00:00
SPRINX0\prochazka 80ca2e5215 Add the LANG environment variable for the web version. #1266 2025-11-24 14:26:25 +01:00
SPRINX0\prochazka 19f2aa2997 smaller upgrade button #1244 2025-11-24 10:57:57 +01:00
Jan Prochazka ec657f30c7 Merge pull request #1268 from dbgate/feature/sort-sql
Feature/sort sql
2025-11-24 09:04:06 +01:00
SPRINX0\prochazka 7e84d495f5 sort by fix 2025-11-24 09:02:46 +01:00
SPRINX0\prochazka c3baedd93c sort tables by size/rowCount 2025-11-24 08:58:49 +01:00
SPRINX0\prochazka ae9676f744 sql object sort WIP 2025-11-21 16:37:12 +01:00
SPRINX0\prochazka 7ec156a5d1 table rows, table size in Oracle 2025-11-21 16:19:51 +01:00
SPRINX0\prochazka b80cbea1bc show mongo collection sizes #552 2025-11-21 16:07:27 +01:00
SPRINX0\prochazka 4600fa9f32 Show table size fo MySQL and Postgres #552 2025-11-21 15:56:26 +01:00
SPRINX0\prochazka 6e0b3e5cdc fixed: Check updates option no longer available in 6.7.0 #1263 2025-11-21 15:18:00 +01:00
SPRINX0\prochazka 519ff87f5d Merge branch 'feature/mongo-legacy' 2025-11-21 12:57:31 +01:00
SPRINX0\prochazka d4a363e37e v6.7.1-premium-beta.3 2025-11-21 10:46:26 +01:00
SPRINX0\prochazka a3cfc45fef legacy mongodb optimalization + test fix 2025-11-21 10:44:06 +01:00
SPRINX0\prochazka 60602e02d9 logging app language 2025-11-20 17:31:18 +01:00
SPRINX0\prochazka 44366f7872 v6.7.1-premium-beta.2 2025-11-20 16:26:40 +01:00
SPRINX0\prochazka 2f18d8c204 fixed package version 2025-11-20 16:26:26 +01:00
SPRINX0\prochazka 08efbee52b italian translation 2025-11-20 16:14:56 +01:00
SPRINX0\prochazka eac8d78c5d v6.7.1-premium-beta.1 2025-11-20 15:38:04 +01:00
SPRINX0\prochazka db73673374 Connection to MognoDB legacy 2025-11-20 15:35:09 +01:00
SPRINX0\prochazka 281cdb7264 "Show foreign key hints" showing only in premium 2025-11-20 14:18:51 +01:00
SPRINX0\prochazka 101c80d820 fixed: A MERGE statement must be terminated by a semi-colon (;), but dbgate stripped it. #1257 2025-11-20 12:59:54 +01:00
SPRINX0\prochazka 1e06f65d9e portugese (brasil) translation 2025-11-19 18:16:59 +01:00
SPRINX0\prochazka eea85709ed fixed error in auth login 2025-11-19 17:03:22 +01:00
67 changed files with 4257 additions and 142 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -39,7 +39,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -44,7 +44,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1
View File
@@ -24,6 +24,7 @@ docker/plugins
.env.development.local
.env.test.local
.env.production.local
.env.translation
npm-debug.log*
yarn-debug.log*
+10
View File
@@ -8,6 +8,16 @@ Builds:
- linux - application for linux
- win - application for Windows
## 6.7.1 - not released yet
- ADDED: LANGUAGE environment variable for the web version. #1266
- ADDED: New localizations (Italian, Portugese (Brazil), Japanese)
- ADDED: Option to detect language from browser settings in web version
- FIXED: Check updates option no longer available in 6.7.0 #1263
- FIXED: A MERGE statement must be terminated by a semi-colon (;), but dbgate stripped it. #1257
- ADDED: Show table size #552
- ADDED: Sort tables by size and by row count
- ADDED: Connect to Legacy MongoDB (Premium) #540
## 6.7.0
- ADDED: Added localization support, now you can use DbGate in multiple languages (French, Spanish, German, Czech, Slovak, Simplified Chinese) #347 #705 #939 #1079
- CHANGED: Solved many issues with binary fields, huge performance improvements in binary fields processing
+1 -1
View File
@@ -118,7 +118,7 @@ module.exports = ({ editMenu, isMac }, currentTranslations = null) => [
{ command: 'tabs.changelog', hideDisabled: true },
{ command: 'about.show', hideDisabled: true },
{ divider: true },
{ command: 'file.checkForUpdates', hideDisabled: true },
{ command: 'app.checkForUpdates', hideDisabled: true },
],
},
];
+132
View File
@@ -0,0 +1,132 @@
require('dotenv').config({ path: '.env.translation' });
const fs = require('fs');
const path = require('path');
const OpenAI = require('openai');
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const translationsDir = path.join(__dirname, '../../translations');
const enFilePath = path.join(translationsDir, 'en.json');
const languageNames = {
'cs.json': 'Czech',
'de.json': 'German',
'es.json': 'Spanish',
'fr.json': 'French',
'it.json': 'Italian',
'ja.json': 'Japanese',
'pt.json': 'Portuguese',
'sk.json': 'Slovak',
'zh.json': 'Chinese'
};
// Read source (english)
const enTranslations = JSON.parse(fs.readFileSync(enFilePath, 'utf8'));
const enKeys = Object.keys(enTranslations);
// Get all translation files
const translationFiles = fs.readdirSync(translationsDir)
.filter(file => file.endsWith('.json') && file !== 'en.json')
.sort();
console.log(`Found ${enKeys.length} keys in en.json\n`);
console.log('='.repeat(80));
async function translateMissingIds({file, translations, missingIds}){
const languageName = languageNames[file];
if (!languageName) {
console.log(`No language name mapping for file: ${file}`);
return;
}
// Build object with only missing translations
const needed = {};
missingIds.forEach(key => {
needed[key] = enTranslations[key];
});
// Get all existing translations as style examples
const existingTranslations = {};
Object.keys(translations).forEach(key => {
if (translations[key] && !translations[key].startsWith('***')) {
existingTranslations[key] = {
en: enTranslations[key],
translated: translations[key]
};
}
});
const prompt = `You are a professional translator for DbGate, a database management application.
Translate the following English UI strings to ${languageName}.
IMPORTANT RULES:
1. Preserve ALL placeholders exactly as they appear: {plugin}, {columnNumber}, {0}, {1}, etc.
2. Maintain technical terminology appropriately for database software
3. Match the translation style, tone, and formality of the existing translations shown below
4. Keep the same level of brevity or verbosity as the existing translations
5. Return ONLY valid JSON - no markdown, no explanations, no code blocks
6. Use the same keys as provided
EXISTING TRANSLATIONS (for style reference):
${JSON.stringify(existingTranslations, null, 2)}
STRINGS TO TRANSLATE:
${JSON.stringify(needed, null, 2)}
Return format: {"key": "translated value", ...}`;
const response = await client.chat.completions.create({
model: 'gpt-5.1',
messages: [
{ role: 'system', content: 'You are a professional translator specializing in software localization. Match the style and tone of existing translations. Return only valid JSON.' },
{ role: 'user', content: prompt }
],
temperature: 0.2
});
let translatedJson = response.choices[0].message.content.trim();
// Remove markdown code blocks if present
translatedJson = translatedJson.replace(/^```json\n?/, '').replace(/\n?```$/, '');
return JSON.parse(translatedJson);
}
(async () => {
for (const file of translationFiles) {
const filePath = path.join(translationsDir, file);
const translations = JSON.parse(fs.readFileSync(filePath, 'utf8'));
const missingIds = enKeys.filter(key => !translations.hasOwnProperty(key) || (typeof translations[key] === 'string' && translations[key].startsWith('***')));
console.log(`\n${file.toUpperCase()}`);
console.log('-'.repeat(80));
if (missingIds.length === 0) {
console.log('✓ All translations complete!');
continue;
} else {
console.log(`Found ${missingIds.length} untranslated IDs\n`);
}
const newTranslations = await translateMissingIds({file, translations, missingIds});
if (!newTranslations) {
console.log(`Skipping file due to translation error: ${file}`);
continue;
}
for (const [key, value] of Object.entries(newTranslations)) {
translations[key] = value;
console.log(`Translated: ${key} => ${value}`);
}
fs.writeFileSync(filePath, JSON.stringify(translations, null, 2) + '\n', 'utf8');
console.log(`\n✓ Updated translations written to ${file}`);
}
console.log('\n' + '='.repeat(80));
console.log('Translation complete!\n');
})();
+1
View File
@@ -4,6 +4,7 @@ const volatilePackages = [
'@clickhouse/client',
'bson', // this package is already bundled and is used in mongodb
'mongodb',
'mongodb-old',
'mongodb-client-encryption',
'tedious',
'msnodesqlv8',
+1 -1
View File
@@ -1,6 +1,6 @@
{
"private": true,
"version": "6.7.0",
"version": "6.7.1-premium-beta.3",
"name": "dbgate-all",
"workspaces": [
"packages/*",
+1 -1
View File
@@ -31,7 +31,7 @@
"cors": "^2.8.5",
"cross-env": "^6.0.3",
"dbgate-datalib": "^6.0.0-alpha.1",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-sqltree": "^6.0.0-alpha.1",
"dbgate-tools": "^6.0.0-alpha.1",
"debug": "^4.3.4",
+2 -2
View File
@@ -35,8 +35,8 @@ module.exports = {
},
refreshPublicFiles_meta: true,
async refreshPublicFiles({ isRefresh }) {
await refreshPublicFiles(isRefresh);
async refreshPublicFiles({ isRefresh }, req) {
await refreshPublicFiles(isRefresh, req?.headers?.['x-ui-language']);
return {
status: 'ok',
};
+2
View File
@@ -71,6 +71,7 @@ module.exports = {
const isLicenseValid = checkedLicense?.status == 'ok';
const logoutUrl = storageConnectionError ? null : await authProvider.getLogoutUrl();
const adminConfig = storageConnectionError ? null : await storage.readConfig({ group: 'admin' });
const settingsConfig = storageConnectionError ? null : await storage.readConfig({ group: 'settings' });
storage.startRefreshLicense();
@@ -121,6 +122,7 @@ module.exports = {
allowPrivateCloud: platformInfo.isElectron || !!process.env.ALLOW_DBGATE_PRIVATE_CLOUD,
...currentVersion,
redirectToDbGateCloudLogin: !!process.env.REDIRECT_TO_DBGATE_CLOUD_LOGIN,
preferrendLanguage: settingsConfig?.['storage.language'] || process.env.LANGUAGE || null,
};
return configResult;
+14 -3
View File
@@ -14,7 +14,11 @@ const JsonLinesDatabase = require('../utility/JsonLinesDatabase');
const processArgs = require('../utility/processArgs');
const { safeJsonParse, getLogger, extractErrorLogData } = require('dbgate-tools');
const platformInfo = require('../utility/platformInfo');
const { connectionHasPermission, testConnectionPermission, loadPermissionsFromRequest } = require('../utility/hasPermission');
const {
connectionHasPermission,
testConnectionPermission,
loadPermissionsFromRequest,
} = require('../utility/hasPermission');
const pipeForkLogs = require('../utility/pipeForkLogs');
const requireEngineDriver = require('../utility/requireEngineDriver');
const { getAuthProviderById } = require('../auth/authProvider');
@@ -116,7 +120,10 @@ function getPortalCollections() {
}
}
logger.info({ connections: connections.map(pickSafeConnectionInfo) }, 'DBGM-00005 Using connections from ENV variables');
logger.info(
{ connections: connections.map(pickSafeConnectionInfo) },
'DBGM-00005 Using connections from ENV variables'
);
const noengine = connections.filter(x => !x.engine);
if (noengine.length > 0) {
logger.warn(
@@ -502,7 +509,11 @@ module.exports = {
state,
client: 'web',
});
res.redirect(authResp.url);
if (authResp?.url) {
res.redirect(authResp.url);
return;
}
res.json({ error: 'No URL returned from auth provider' });
},
dbloginApp_meta: true,
+13 -1
View File
@@ -1533,6 +1533,12 @@ module.exports = {
"columnName": "name",
"dataType": "varchar(250)",
"notNull": true
},
{
"pureName": "team_file_types",
"columnName": "format",
"dataType": "varchar(50)",
"notNull": false
}
],
"foreignKeys": [],
@@ -1549,7 +1555,13 @@ module.exports = {
"preloadedRows": [
{
"id": -1,
"name": "sql"
"name": "sql",
"format": "text"
},
{
"id": -2,
"name": "diagrams",
"format": "json"
}
]
},
+10 -5
View File
@@ -193,7 +193,7 @@ async function getCloudSigninHeaders(holder = null) {
return null;
}
async function updateCloudFiles(isRefresh) {
async function updateCloudFiles(isRefresh, language) {
let lastCloudFilesTags;
try {
lastCloudFilesTags = await fs.readFile(path.join(datadir(), 'cloud-files-tags.txt'), 'utf-8');
@@ -218,6 +218,7 @@ async function updateCloudFiles(isRefresh) {
...getLicenseHttpHeaders(),
...(await getCloudInstanceHeaders()),
'x-app-version': currentVersion.version,
'x-app-language': language || 'en',
},
}
);
@@ -274,7 +275,7 @@ async function ensurePromoWidgetDataLoaded() {
promoWidgetDataLoaded = true;
}
async function updatePremiumPromoWidget() {
async function updatePremiumPromoWidget(language) {
await ensurePromoWidgetDataLoaded();
const tags = (await collectCloudFilesSearchTags()).join(',');
@@ -286,6 +287,7 @@ async function updatePremiumPromoWidget() {
...getLicenseHttpHeaders(),
...(await getCloudInstanceHeaders()),
'x-app-version': currentVersion.version,
'x-app-language': language || 'en',
},
}
);
@@ -300,18 +302,21 @@ async function updatePremiumPromoWidget() {
socket.emitChanged(`promo-widget-changed`);
}
async function refreshPublicFiles(isRefresh) {
async function refreshPublicFiles(isRefresh, uiLanguage) {
const language = platformInfo.isElectron
? (await config.getCachedSettings())?.['localization.language'] || 'en'
: uiLanguage;
if (!cloudFiles) {
await loadCloudFiles();
}
try {
await updateCloudFiles(isRefresh);
await updateCloudFiles(isRefresh, language);
} catch (err) {
logger.error(extractErrorLogData(err), 'DBGM-00166 Error updating cloud files');
}
const configSettings = await config.get();
if (!isProApp() || configSettings?.trialDaysLeft != null) {
await updatePremiumPromoWidget();
await updatePremiumPromoWidget(language);
}
}
+1 -1
View File
@@ -33,7 +33,7 @@
},
"dependencies": {
"blueimp-md5": "^2.19.0",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-sqltree": "^6.0.0-alpha.1",
"debug": "^4.3.4",
"json-stable-stringify": "^1.0.1",
+1 -1
View File
@@ -32,7 +32,7 @@
"chartjs-plugin-datalabels": "^2.2.0",
"cross-env": "^7.0.3",
"dbgate-datalib": "^6.0.0-alpha.1",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-sqltree": "^6.0.0-alpha.1",
"dbgate-tools": "^6.0.0-alpha.1",
"dbgate-types": "^6.0.0-alpha.1",
+1 -1
View File
@@ -61,7 +61,7 @@
initializeAppUpdates();
installCloudListeners();
refreshPublicCloudFiles();
saveSelectedLanguageToCache();
saveSelectedLanguageToCache(config.preferrendLanguage);
const electron = getElectron();
if (electron) {
@@ -396,17 +396,17 @@
functionName: 'tableReader',
},
hasPermission('dbops/model/edit') && {
label: _t('dbObject.dropCollection', { defaultMessage: 'Drop collection/container'}),
label: _t('dbObject.dropCollection', { defaultMessage: 'Drop collection/container' }),
isDropCollection: true,
requiresWriteAccess: true,
},
hasPermission('dbops/table/rename') && {
label: _t('dbObject.renameCollection', { defaultMessage: 'Rename collection/container'}),
label: _t('dbObject.renameCollection', { defaultMessage: 'Rename collection/container' }),
isRenameCollection: true,
requiresWriteAccess: true,
},
hasPermission('dbops/table/backup') && {
label: _t('dbObject.createCollectionBackup', { defaultMessage: 'Create collection/container backup'}),
label: _t('dbObject.createCollectionBackup', { defaultMessage: 'Create collection/container backup' }),
isDuplicateCollection: true,
requiresWriteAccess: true,
},
@@ -590,7 +590,10 @@
});
} else if (menu.isDropCollection) {
showModal(ConfirmModal, {
message: _t('dbObject.confirmDropCollection', { defaultMessage: 'Really drop collection {name}?', values: { name: data.pureName } }),
message: _t('dbObject.confirmDropCollection', {
defaultMessage: 'Really drop collection {name}?',
values: { name: data.pureName },
}),
onConfirm: async () => {
const dbid = _.pick(data, ['conid', 'database']);
runOperationOnDatabase(dbid, {
@@ -621,7 +624,10 @@
const driver = await getDriver();
showModal(ConfirmModal, {
message: _t('dbObject.confirmCloneCollection', { defaultMessage: 'Really create collection/container copy named {name}?', values: { name: newName } }),
message: _t('dbObject.confirmCloneCollection', {
defaultMessage: 'Really create collection/container copy named {name}?',
values: { name: newName },
}),
onConfirm: async () => {
const dbid = _.pick(data, ['conid', 'database']);
runOperationOnDatabase(dbid, {
@@ -721,9 +727,7 @@
if (!item.submenu) {
if (!item) return item;
return {...item,
label: _tval(item.label)
};
return { ...item, label: _tval(item.label) };
}
return {
...item,
@@ -773,7 +777,9 @@
openNewTab(
{
// title: getObjectTitle(connection, schemaName, pureName),
title: tabComponent ? getObjectTitle(connection, schemaName, pureName) : _t('dbObject.query', { defaultMessage: 'Query #' }),
title: tabComponent
? getObjectTitle(connection, schemaName, pureName)
: _t('dbObject.query', { defaultMessage: 'Query #' }),
focused: tabComponent == null,
tooltip,
icon:
@@ -1040,6 +1046,7 @@
import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate';
import { getBoolSettingsValue, getOpenDetailOnArrowsSettings } from '../settings/settingsTools';
import { isProApp } from '../utility/proTools';
import formatFileSize from '../utility/formatFileSize';
export let data;
export let passProps;
@@ -1068,6 +1075,9 @@
if (data.tableRowCount != null) {
res.push(`${formatRowCount(data.tableRowCount)} rows`);
}
if (data.sizeBytes) {
res.push(formatFileSize(data.sizeBytes));
}
if (data.tableEngine) {
res.push(data.tableEngine);
}
+15 -7
View File
@@ -115,7 +115,7 @@ registerCommand({
toolbar: true,
icon: 'icon new-connection',
toolbarName: __t('command.new.connection', { defaultMessage: 'Add connection' }),
category: __t('command.new', { defaultMessage: 'New'}),
category: __t('command.new', { defaultMessage: 'New' }),
toolbarOrder: 1,
name: __t('command.new.connection', { defaultMessage: 'Connection' }),
testEnabled: () => !getCurrentConfig()?.runAsPortal && !getCurrentConfig()?.storageDatabase,
@@ -561,7 +561,10 @@ registerCommand({
testEnabled: () => true,
onClick: () => {
showModal(ConfirmModal, {
message: _t('command.file.resetLayoutConfirm', { defaultMessage: 'Really reset layout data? All opened tabs, settings and layout data will be lost. Connections and saved files will be preserved. After this, restart DbGate for applying changes.' }),
message: _t('command.file.resetLayoutConfirm', {
defaultMessage:
'Really reset layout data? All opened tabs, settings and layout data will be lost. Connections and saved files will be preserved. After this, restart DbGate for applying changes.',
}),
onConfirm: async () => {
await apiCall('config/delete-settings');
localStorage.clear();
@@ -665,7 +668,9 @@ registerCommand({
'currentArchive',
];
for (const key of keys) removeLocalStorage(key);
showSnackbarSuccess(_t('command.view.restart', { defaultMessage: 'Restart DbGate (or reload on web) for applying changes' }));
showSnackbarSuccess(
_t('command.view.restart', { defaultMessage: 'Restart DbGate (or reload on web) for applying changes' })
);
},
});
@@ -799,7 +804,9 @@ registerCommand({
registerCommand({
id: 'file.exit',
category: __t('command.file', { defaultMessage: 'File' }),
name: isMac() ? __t('command.file.quit', { defaultMessage: 'Quit' }) : __t('command.file.exit', { defaultMessage: 'Exit' }),
name: isMac()
? __t('command.file.quit', { defaultMessage: 'Quit' })
: __t('command.file.exit', { defaultMessage: 'Exit' }),
// keyText: isMac() ? 'Command+Q' : null,
testEnabled: () => getElectron() != null,
onClick: () => getElectron().send('quit-app'),
@@ -862,6 +869,7 @@ export function registerFileCommands({
undoRedo = false,
executeAdditionalCondition = null,
copyPaste = false,
defaultTeamFolder = false,
}) {
if (save) {
registerCommand({
@@ -874,7 +882,7 @@ export function registerFileCommands({
toolbar: true,
isRelatedToTab: true,
testEnabled: () => getCurrentEditor() != null,
onClick: () => saveTabFile(getCurrentEditor(), 'save', folder, format, fileExtension),
onClick: () => saveTabFile(getCurrentEditor(), 'save', folder, format, fileExtension, defaultTeamFolder),
});
registerCommand({
id: idPrefix + '.saveAs',
@@ -882,14 +890,14 @@ export function registerFileCommands({
category,
name: __t('command.saveAs', { defaultMessage: 'Save As' }),
testEnabled: () => getCurrentEditor() != null,
onClick: () => saveTabFile(getCurrentEditor(), 'save-as', folder, format, fileExtension),
onClick: () => saveTabFile(getCurrentEditor(), 'save-as', folder, format, fileExtension, defaultTeamFolder),
});
registerCommand({
id: idPrefix + '.saveToDisk',
category,
name: __t('command.saveToDisk', { defaultMessage: 'Save to disk' }),
testEnabled: () => getCurrentEditor() != null && getElectron() != null,
onClick: () => saveTabFile(getCurrentEditor(), 'save-to-disk', folder, format, fileExtension),
onClick: () => saveTabFile(getCurrentEditor(), 'save-to-disk', folder, format, fileExtension, defaultTeamFolder),
});
}
+28 -6
View File
@@ -86,14 +86,26 @@
submenuKey += 1;
return;
}
if (item.switchStore && item.switchValue) {
item.switchStore.update(x => ({
...x,
[item.switchValue]: !x[item.switchValue],
}));
if (item.switchStore) {
if (item.switchValue) {
item.switchStore.update(x => ({
...x,
[item.switchValue]: !x[item.switchValue],
}));
}
if (item.switchOption && item.switchOptionValue) {
item.switchStore.update(x => ({
...x,
[item.switchOption]: item.switchOptionValue,
}));
}
switchIndex++;
return;
if (!item.closeOnSwitchClick) {
return;
}
}
dispatchClose();
if (onCloseParent) onCloseParent();
if (item.onClick) item.onClick();
@@ -163,6 +175,16 @@
{/if}
{/key}
{/if}
{#if item.switchOption && item.switchStoreGetter}
{@const optionValue = item.switchStoreGetter()[item.switchOption]}
{#key switchIndex}
{#if optionValue === item.switchOptionValue || (item.switchOptionIsDefault && !optionValue)}
<FontIcon icon="icon check" padRight />
{:else}
<FontIcon icon="icon invisible-box" padRight />
{/if}
{/key}
{/if}
{item.text || item.label}
</span>
{#if item.keyText}
+28 -13
View File
@@ -14,6 +14,8 @@
import { closeCurrentModal, showModal } from './modalTools';
import FormCloudFolderSelect from '../forms/FormCloudFolderSelect.svelte';
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import { useConfig } from '../utility/metadataLoaders';
import { showSnackbarError } from '../utility/snackbar';
export let data;
export let name;
@@ -24,26 +26,39 @@
export let onSave = undefined;
export let folid;
export let skipLocal = false;
export let defaultTeamFolder = false;
// export let cntid;
const values = writable({ name, cloudFolder: folid ?? '__local' });
const configValue = useConfig();
const values = writable({
name,
cloudFolder: folid ?? '__local',
saveToTeamFolder: !!(getCurrentConfig()?.storageDatabase && defaultTeamFolder),
});
const electron = getElectron();
const handleSubmit = async e => {
const { name, cloudFolder } = e.detail;
if ($values['saveToTeamFolder']) {
const { teamFileId } = await apiCall('team-files/create-new', { fileType: folder, file: name, data });
closeCurrentModal();
if (onSave) {
onSave(name, {
savedFile: name,
savedFolder: folder,
savedFilePath: null,
savedCloudFolderId: null,
savedCloudContentId: null,
savedTeamFileId: teamFileId,
});
const resp = await apiCall('team-files/create-new', { fileType: folder, file: name, data });
if (resp?.apiErrorMessage) {
showSnackbarError(resp.apiErrorMessage);
} else if (resp?.teamFileId) {
closeCurrentModal();
if (onSave) {
onSave(name, {
savedFile: name,
savedFolder: folder,
savedFilePath: null,
savedCloudFolderId: null,
savedCloudContentId: null,
savedTeamFileId: resp.teamFileId,
});
}
} else {
showSnackbarError('Failed to save to team folder.');
}
} else if (cloudFolder === '__local') {
await apiCall('files/save', { folder, file: name, data, format });
@@ -124,7 +139,7 @@
]}
/>
{/if}
{#if getCurrentConfig().storageDatabase}
{#if $configValue?.storageDatabase}
<FormCheckboxField label="Save to team folder" name="saveToTeamFolder" />
{/if}
+10 -5
View File
@@ -194,7 +194,10 @@ ORDER BY
{ value: 'en', label: 'English' },
{ value: 'es', label: 'Español' },
{ value: 'fr', label: 'Français' },
{ value: 'it', label: 'Italiano' },
{ value: 'pt', label: 'Português (Brasil)' },
{ value: 'sk', label: 'Slovenčina' },
{ value: 'ja', label: '日本語' },
{ value: 'zh', label: '中文' },
]}
defaultValue={getSelectedLanguage()}
@@ -223,11 +226,13 @@ ORDER BY
})}
defaultValue="100"
/>
<FormCheckboxField
name="dataGrid.showHintColumns"
label={_t('settings.dataGrid.showHintColumns', { defaultMessage: 'Show foreign key hints' })}
defaultValue={true}
/>
{#if isProApp()}
<FormCheckboxField
name="dataGrid.showHintColumns"
label={_t('settings.dataGrid.showHintColumns', { defaultMessage: 'Show foreign key hints' })}
defaultValue={true}
/>
{/if}
<!-- <FormCheckboxField name="dataGrid.showHintColumns" label="Show foreign key hints" defaultValue={true} /> -->
<FormCheckboxField
+1
View File
@@ -200,6 +200,7 @@ export const DEFAULT_OBJECT_SEARCH_SETTINGS = {
sqlObjectText: false,
tableEngine: false,
tablesWithRows: false,
sortBy: undefined as string
};
export const DEFAULT_CONNECTION_SEARCH_SETTINGS = {
+5 -2
View File
@@ -758,7 +758,7 @@
title="Upgrade to Premium"
data-testid="TabsPanel_buttonUpgrade"
>
<FontIcon icon="icon premium" padRight /> Upgrade
<FontIcon icon="icon premium" /> Upgrade
</div>
{/if}
@@ -803,6 +803,9 @@
cursor: pointer;
font-size: 10pt;
padding: 5px;
margin-top: 3px;
margin-right: 3px;
font-size: 8pt;
}
.upgrade-button:hover {
background: linear-gradient(135deg, #0f5a85, #5c1870);
@@ -822,7 +825,7 @@
}
.tabs-upgrade-button {
right: 120px;
right: 110px;
}
.tabs.can-split {
right: 60px;
+1
View File
@@ -8,6 +8,7 @@
folder: 'diagrams',
format: 'json',
fileExtension: 'diagram',
defaultTeamFolder: true,
undoRedo: true,
});
+1
View File
@@ -52,6 +52,7 @@
findReplace: true,
executeAdditionalCondition: () => getCurrentEditor()?.hasConnection() && hasPermission('dbops/query'),
copyPaste: true,
defaultTeamFolder: true,
});
registerCommand({
id: 'query.executeCurrent',
+16 -7
View File
@@ -4,6 +4,9 @@ import de from '../../../translations/de.json';
import fr from '../../../translations/fr.json';
import es from '../../../translations/es.json';
import zh from '../../../translations/zh.json';
import pt from '../../../translations/pt.json';
import it from '../../../translations/it.json';
import ja from '../../../translations/ja.json';
import MessageFormat, { MessageFunction } from '@messageformat/core';
import { getStringSettingsValue } from './settings/settingsTools';
@@ -16,8 +19,11 @@ const translations = {
sk,
de,
fr,
es,
zh,
es,
pt,
it,
ja,
};
const supportedLanguages = Object.keys(translations);
@@ -27,13 +33,16 @@ const defaultLanguage = 'en';
let selectedLanguageCache: string | null = null;
export function getSelectedLanguage(): string {
export function getSelectedLanguage(preferrendLanguage?: string): string {
if (selectedLanguageCache) return selectedLanguageCache;
// const browserLanguage = getBrowserLanguage();
if (preferrendLanguage == 'auto') {
preferrendLanguage = getBrowserLanguage();
}
const selectedLanguage = getElectron()
? getStringSettingsValue('localization.language', null)
: localStorage.getItem('selectedLanguage');
? getStringSettingsValue('localization.language', preferrendLanguage)
: localStorage.getItem('selectedLanguage') ?? preferrendLanguage;
if (!selectedLanguage || !supportedLanguages.includes(selectedLanguage)) return defaultLanguage;
return selectedLanguage;
@@ -47,8 +56,8 @@ export async function setSelectedLanguage(language: string) {
}
}
export function saveSelectedLanguageToCache() {
selectedLanguageCache = getSelectedLanguage();
export function saveSelectedLanguageToCache(preferrendLanguage?: string) {
selectedLanguageCache = getSelectedLanguage(preferrendLanguage);
}
export function getBrowserLanguage(): string {
+1
View File
@@ -186,6 +186,7 @@ export async function apiCall(
headers: {
'Content-Type': 'application/json',
'x-api-session-id': getApiSessionId(),
'x-ui-language': localStorage.getItem('selectedLanguage') || 'en',
...resolveApiHeaders(),
},
body: JSON.stringify(args, serializeJsTypesReplacer),
+2 -1
View File
@@ -11,7 +11,7 @@ import getElectron from './getElectron';
// return derived(editorStore, editor => editor != null);
// }
export default async function saveTabFile(editor, saveMode, folder, format, fileExtension) {
export default async function saveTabFile(editor, saveMode, folder, format, fileExtension, defaultTeamFolder) {
const tabs = get(openedTabs);
const tabid = editor.activator.tabid;
const data = editor.getData();
@@ -94,6 +94,7 @@ export default async function saveTabFile(editor, saveMode, folder, format, file
filePath: savedFilePath,
onSave,
folid: savedCloudFolderId,
defaultTeamFolder,
// cntid: savedCloudContentId,
});
}
+84 -14
View File
@@ -79,12 +79,30 @@
// $: console.log('OBJECTS', $objects);
$: sortArgs =
$databaseObjectAppObjectSearchSettings.sortBy == 'rowCount'
? [
['rowCount', 'sizeBytes', 'schemaName', 'pureName'],
['desc', 'desc', 'asc', 'asc'],
]
: $databaseObjectAppObjectSearchSettings.sortBy == 'sizeBytes'
? [
['sizeBytes', 'rowCount', 'schemaName', 'pureName'],
['desc', 'desc', 'asc', 'asc'],
]
: [
['schemaName', 'pureName'],
['asc', 'asc'],
];
$: objectList = _.flatten([
...['tables', 'collections', 'views', 'matviews', 'procedures', 'functions', 'triggers', 'schedulerEvents'].map(
objectTypeField =>
_.sortBy(
_.orderBy(
(($objects || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })),
['schemaName', 'pureName']
sortArgs[0],
// @ts-ignore
sortArgs[1]
)
),
...appsForDb.map(app =>
@@ -133,19 +151,62 @@
const res = [];
res.push({ label: _t('sqlObject.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true });
if (driver?.databaseEngineTypes?.includes('document')) {
res.push({ label: _t('sqlObject.collectionName', { defaultMessage: 'Collection name' }), switchValue: 'pureName' });
res.push({
label: _t('sqlObject.collectionName', { defaultMessage: 'Collection name' }),
switchValue: 'pureName',
});
}
if (driver?.databaseEngineTypes?.includes('sql')) {
res.push({ label: _t('sqlObject.tableViewProcedureName', { defaultMessage: 'Table/view/procedure name' }), switchValue: 'pureName' });
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.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' });
res.push({
label: _t('sqlObject.tablesWithRows', { defaultMessage: 'Only tables with rows' }),
switchValue: 'tablesWithRows',
});
}
res.push({ label: _t('sqlObject.sortBy', { defaultMessage: 'Sort by:' }), isBold: true, disabled: true });
res.push({
label: _t('sqlObject.name', { defaultMessage: 'Name' }),
switchOption: 'sortBy',
switchOptionValue: 'name',
switchOptionIsDefault: true,
closeOnSwitchClick: true,
});
res.push({
label: _t('sqlObject.rowCount', { defaultMessage: 'Row count' }),
switchOption: 'sortBy',
switchOptionValue: 'rowCount',
closeOnSwitchClick: true,
});
res.push({
label: _t('sqlObject.sizeBytes', { defaultMessage: 'Size (bytes)' }),
switchOption: 'sortBy',
switchOptionValue: 'sizeBytes',
closeOnSwitchClick: true,
});
return res.map(item => ({
...item,
switchStore: databaseObjectAppObjectSearchSettings,
@@ -193,19 +254,25 @@
<WidgetsInnerContainer hideContent={differentFocusedDb}>
<ErrorInfo
message={_t('sqlObject.databaseEmpty', { defaultMessage: 'Database {database} is empty or structure is not loaded, press Refresh button to reload structure', values: { database } })}
message={_t('sqlObject.databaseEmpty', {
defaultMessage:
'Database {database} is empty or structure is not loaded, press Refresh button to reload structure',
values: { database },
})}
icon="img alert"
/>
<div class="m-1" />
<InlineButton on:click={handleRefreshDatabase}>{_t('common.refresh', { defaultMessage: 'Refresh' })}</InlineButton>
{#if driver?.databaseEngineTypes?.includes('sql')}
<div class="m-1" />
<InlineButton on:click={() => runCommand('new.table')}>{_t('database.newTable', { defaultMessage: 'New table' })}</InlineButton>
<InlineButton on:click={() => runCommand('new.table')}
>{_t('database.newTable', { defaultMessage: 'New table' })}</InlineButton
>
{/if}
{#if driver?.databaseEngineTypes?.includes('document')}
<div class="m-1" />
<InlineButton on:click={() => runCommand('new.collection')}
>{_t('sqlObject.newCollection', { defaultMessage: 'New collection/container'})}</InlineButton
>{_t('sqlObject.newCollection', { defaultMessage: 'New collection/container' })}</InlineButton
>
{/if}
</WidgetsInnerContainer>
@@ -233,7 +300,7 @@
{/if}
<InlineButton
on:click={handleRefreshDatabase}
title={_t('sqlObjectList.refreshDatabase', { defaultMessage: "Refresh database connection and object list" })}
title={_t('sqlObjectList.refreshDatabase', { defaultMessage: 'Refresh database connection and object list' })}
square
data-testid="SqlObjectList_refreshButton"
>
@@ -260,7 +327,10 @@
data-testid="SqlObjectList_container"
>
{#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects}
<LoadingInfo message={$status?.feedback?.analysingMessage || _t('sqlObject.loadingStructure', { defaultMessage: 'Loading database structure' })} />
<LoadingInfo
message={$status?.feedback?.analysingMessage ||
_t('sqlObject.loadingStructure', { defaultMessage: 'Loading database structure' })}
/>
{:else}
<AppObjectListHandler
bind:this={domListHandler}
+1 -1
View File
@@ -37,7 +37,7 @@
"dependencies": {
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"dbgate-query-splitter": "^4.11.7"
"dbgate-query-splitter": "^4.11.9"
},
"optionalDependencies": {
"@duckdb/node-api": "^1.2.1-alpha.16"
+1 -1
View File
@@ -38,7 +38,7 @@
"wkx": "^0.5.0",
"pg-copy-streams": "^6.0.6",
"node-firebird": "^1.1.9",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"pg": "^8.11.5"
+2 -1
View File
@@ -37,11 +37,12 @@
},
"dependencies": {
"bson": "^6.8.0",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"is-promise": "^4.0.0",
"lodash": "^4.17.21",
"mongodb": "^6.3.0",
"mongodb-old": "npm:mongodb@6.16.0",
"@mongosh/browser-runtime-electron": "^3.16.4",
"@mongosh/service-provider-node-driver": "^3.10.2"
},
@@ -16,12 +16,16 @@ class Analyser extends DatabaseAnalyser {
collections
.filter((x) => x.type == 'collection')
.map((x) =>
this.dbhan
.getDatabase()
.collection(x.name)
.aggregate([{ $collStats: { count: {} } }])
.toArray()
.then((resp) => ({ name: x.name, count: resp[0].count }))
this.dbhan
.getDatabase()
.collection(x.name)
.aggregate([{ $collStats: { count: {}, storageStats: {} } }])
.toArray()
.then((resp) => ({
name: x.name,
count: resp[0].count,
size: resp[0].storageStats?.size
}))
)
);
} catch (e) {
@@ -29,11 +33,13 @@ class Analyser extends DatabaseAnalyser {
stats = {};
}
const res = this.mergeAnalyseResult({
collections: [
...collections.map((x, index) => ({
pureName: x.name,
tableRowCount: stats[index]?.count,
sizeBytes: stats[index]?.size,
uniqueKey: [{ columnName: '_id' }],
partitionKey: [{ columnName: '_id' }],
clusterKey: [{ columnName: '_id' }],
@@ -1,10 +1,11 @@
const _ = require('lodash');
const { EventEmitter } = require('events');
const stream = require('stream');
const driverBase = require('../frontend/driver');
const driverBases = require('../frontend/drivers');
const Analyser = require('./Analyser');
const isPromise = require('is-promise');
const { MongoClient, ObjectId, AbstractCursor, Long } = require('mongodb');
const mongodb = require('mongodb');
const { ObjectId } = require('mongodb');
const { EJSON } = require('bson');
const { serializeJsTypesForJsonStringify, deserializeJsTypesFromJsonParse, getLogger } = require('dbgate-tools');
const createBulkInsertStream = require('./createBulkInsertStream');
@@ -18,7 +19,8 @@ let isProApp;
const logger = getLogger('mongoDriver');
function serializeMongoData(row) {
function serializeMongoData(row, driverBase) {
const { Long } = driverBase.useLegacyDriver ? require('mongodb-old') : mongodb;
return EJSON.serialize(
serializeJsTypesForJsonStringify(row, (value) => {
if (value instanceof Long) {
@@ -33,10 +35,10 @@ function serializeMongoData(row) {
);
}
async function readCursor(cursor, options) {
async function readCursor(cursor, options, driverBase) {
options.recordset({ __isDynamicStructure: true });
await cursor.forEach((row) => {
options.row(serializeMongoData(row));
options.row(serializeMongoData(row, driverBase));
});
}
@@ -86,8 +88,8 @@ async function getScriptableDb(dbhan) {
// }
// }
/** @type {import('dbgate-types').EngineDriver<MongoClient, import('mongodb').Db>} */
const driver = {
/** @type {import('dbgate-types').EngineDriver<import('mongodb').MongoClient, import('mongodb').Db>} */
const drivers = driverBases.map((driverBase) => ({
...driverBase,
analyserClass: Analyser,
async connect({ server, port, user, password, database, useDatabaseUrl, databaseUrl, ssl, useSshTunnel }) {
@@ -120,6 +122,8 @@ const driver = {
options.tlsInsecure = !ssl.rejectUnauthorized;
}
const { MongoClient } = driverBase.useLegacyDriver ? require('mongodb-old') : mongodb;
const client = new MongoClient(mongoUrl, options);
await client.connect();
return {
@@ -314,8 +318,10 @@ const driver = {
return;
}
const { AbstractCursor } = driverBase.useLegacyDriver ? require('mongodb-old') : mongodb;
if (exprValue instanceof AbstractCursor) {
await readCursor(exprValue, options);
await readCursor(exprValue, options, driverBase);
} else if (isPromise(exprValue)) {
try {
const resValue = await exprValue;
@@ -427,7 +433,7 @@ const driver = {
const cursorStream = exprValue.stream();
cursorStream.on('data', (row) => {
pass.write(serializeMongoData(row));
pass.write(serializeMongoData(row, driverBase));
});
// propagate error
@@ -487,10 +493,12 @@ const driver = {
let cursor = await collection.aggregate(deserializeMongoData(convertToMongoAggregate(options.aggregate)));
const rows = await cursor.toArray();
return {
rows: rows.map(serializeMongoData).map((x) => ({
...x._id,
..._.omit(x, ['_id']),
})),
rows: rows
.map((row) => serializeMongoData(row, driverBase))
.map((x) => ({
...x._id,
..._.omit(x, ['_id']),
})),
};
} else {
// console.log('options.condition', JSON.stringify(options.condition, undefined, 2));
@@ -500,7 +508,7 @@ const driver = {
if (options.limit) cursor = cursor.limit(options.limit);
const rows = await cursor.toArray();
return {
rows: rows.map(serializeMongoData),
rows: rows.map((row) => serializeMongoData(row, driverBase)),
};
}
} catch (err) {
@@ -613,10 +621,12 @@ const driver = {
]);
const rows = await cursor.toArray();
return _.uniqBy(
rows.map(serializeMongoData).map(({ _id }) => {
if (_.isArray(_id) || _.isPlainObject(_id)) return { value: null };
return { value: _id };
}),
rows
.map((row) => serializeMongoData(row, driverBase))
.map(({ _id }) => {
if (_.isArray(_id) || _.isPlainObject(_id)) return { value: null };
return { value: _id };
}),
(x) => x.value
);
} catch (err) {
@@ -753,10 +763,10 @@ const driver = {
return result;
},
};
}));
driver.initialize = (dbgateEnv) => {
drivers.initialize = (dbgateEnv) => {
isProApp = dbgateEnv.isProApp;
};
module.exports = driver;
module.exports = drivers;
@@ -1,4 +1,4 @@
const driver = require('./driver');
const drivers = require('./drivers');
const {
formatProfilerEntry,
extractProfileTimestamp,
@@ -7,13 +7,13 @@ const {
module.exports = {
packageName: 'dbgate-plugin-mongo',
drivers: [driver],
drivers,
functions: {
formatProfilerEntry,
extractProfileTimestamp,
aggregateProfileChartEntry,
},
initialize(dbgateEnv) {
driver.initialize(dbgateEnv);
drivers.initialize(dbgateEnv);
},
};
@@ -16,9 +16,12 @@ function jsonStringifyWithObjectId(obj) {
return JSON.stringify(obj, mongoReplacer, 2)
.replace(/\{\s*\"\$oid\"\s*\:\s*\"([0-9a-f]+)\"\s*\}/g, (m, id) => `ObjectId("${id}")`)
.replace(/\{\s*\"\$bigint\"\s*\:\s*\"([0-9]+)\"\s*\}/g, (m, num) => `${num}n`)
.replace(/\{\s*"\$binary"\s*:\s*\{\s*"base64"\s*:\s*"([^"]+)"(?:\s*,\s*"subType"\s*:\s*"([0-9a-fA-F]{2})")?\s*\}\s*\}/g, (m, base64, subType) => {
return `BinData(${parseInt(subType || "00", 16)}, "${base64}")`;
});
.replace(
/\{\s*"\$binary"\s*:\s*\{\s*"base64"\s*:\s*"([^"]+)"(?:\s*,\s*"subType"\s*:\s*"([0-9a-fA-F]{2})")?\s*\}\s*\}/g,
(m, base64, subType) => {
return `BinData(${parseInt(subType || '00', 16)}, "${base64}")`;
}
);
}
/** @type {import('dbgate-types').SqlDialect} */
@@ -34,7 +37,7 @@ const dialect = {
};
/** @type {import('dbgate-types').EngineDriver} */
const driver = {
const mongoDriverBase = {
...driverBase,
dumperClass: Dumper,
databaseEngineTypes: ['document'],
@@ -193,4 +196,16 @@ const driver = {
},
};
module.exports = driver;
const mongoDriver = {
...mongoDriverBase,
};
const legacyMongoDriver = {
...mongoDriverBase,
engine: 'mongo-legacy@dbgate-plugin-mongo',
title: 'MongoDB 4 - Legacy',
premiumOnly: true,
useLegacyDriver: true,
};
module.exports = [mongoDriver, legacyMongoDriver];
@@ -1,9 +1,9 @@
import driver from './driver';
import drivers from './drivers';
import { formatProfilerEntry, extractProfileTimestamp, aggregateProfileChartEntry } from './profilerFunctions';
export default {
packageName: 'dbgate-plugin-mongo',
drivers: [driver],
drivers,
functions: {
formatProfilerEntry,
extractProfileTimestamp,
+1 -1
View File
@@ -38,7 +38,7 @@
"dependencies": {
"@azure/identity": "^4.6.0",
"async-lock": "^1.2.6",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"tedious": "^18.6.1"
+1 -1
View File
@@ -36,7 +36,7 @@
"webpack-cli": "^5.1.4"
},
"dependencies": {
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"mysql2": "^3.11.3"
@@ -3,6 +3,7 @@ select
TABLE_NAME as pureName,
TABLE_TYPE as objectType,
TABLE_ROWS as tableRowCount,
DATA_LENGTH + INDEX_LENGTH as sizeBytes,
case when ENGINE='InnoDB' then CREATE_TIME else coalesce(UPDATE_TIME, CREATE_TIME) end as modifyDate
from information_schema.tables
where TABLE_SCHEMA = '#DATABASE#'
@@ -4,6 +4,7 @@ select
TABLE_ROWS as tableRowCount,
ENGINE as tableEngine,
TABLE_COMMENT as objectComment,
DATA_LENGTH + INDEX_LENGTH as sizeBytes,
case when ENGINE='InnoDB' then CREATE_TIME else coalesce(UPDATE_TIME, CREATE_TIME) end as modifyDate
from information_schema.tables
where TABLE_SCHEMA = '#DATABASE#' and (TABLE_TYPE='BASE TABLE' or TABLE_TYPE='SYSTEM VERSIONED') and TABLE_NAME =OBJECT_ID_CONDITION;
+1 -1
View File
@@ -35,7 +35,7 @@
"webpack-cli": "^5.1.4"
},
"dependencies": {
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21"
},
@@ -131,6 +131,8 @@ class Analyser extends DatabaseAnalyser {
// schemaName: table.schema_name,
objectId: `tables:${table.pure_name}`,
contentHash: table.hash_code_columns ? `${table.hash_code_columns}-${table.hash_code_constraints}` : null,
sizeBytes: table.size_bytes,
tableRowCount: table.table_row_count,
};
return {
...newTable,
@@ -1,7 +1,9 @@
module.exports = `
select
-- owner "schema_name",
table_name "pure_name"
table_name "pure_name",
num_rows * avg_row_len "size_bytes",
num_rows "table_row_count"
from
all_tables
where OWNER='$owner' AND 'tables:' || TABLE_NAME =OBJECT_ID_CONDITION
+1 -1
View File
@@ -37,7 +37,7 @@
"dependencies": {
"wkx": "^0.5.0",
"pg-copy-streams": "^6.0.6",
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"pg": "^8.11.5"
@@ -255,6 +255,7 @@ class Analyser extends DatabaseAnalyser {
const newTable = {
pureName: table.pure_name,
schemaName: table.schema_name,
sizeBytes: table.size_bytes,
objectId: `tables:${table.schema_name}.${table.pure_name}`,
contentHash: table.hash_code_columns ? `${table.hash_code_columns}-${table.hash_code_constraints}` : null,
};
@@ -410,6 +411,7 @@ class Analyser extends DatabaseAnalyser {
objectId: `tables:${x.schema_name}.${x.pure_name}`,
pureName: x.pure_name,
schemaName: x.schema_name,
sizeBytes: x.size_bytes,
contentHash: `${x.hash_code_columns}-${x.hash_code_constraints}`,
}))
: null,
@@ -1,5 +1,6 @@
module.exports = `
select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name"
select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name",
pg_relation_size('"'||infoTables.table_schema||'"."'||infoTables.table_name||'"') as "size_bytes"
from information_schema.tables infoTables
where infoTables.table_type not like '%VIEW%'
and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION
@@ -16,7 +16,8 @@ select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_
)) as "hash_code_constraints"
from information_schema.table_constraints infoConstraints
where infoConstraints.table_schema = infoTables.table_schema and infoConstraints.table_name = infoTables.table_name
)
),
pg_relation_size('"'||infoTables.table_schema||'"."'||infoTables.table_name||'"') as "size_bytes"
from information_schema.tables infoTables
where infoTables.table_type not like '%VIEW%'
+1 -1
View File
@@ -34,7 +34,7 @@
"webpack-cli": "^5.1.4"
},
"dependencies": {
"dbgate-query-splitter": "^4.11.7",
"dbgate-query-splitter": "^4.11.9",
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"async": "^3.2.3",
+1 -1
View File
@@ -37,7 +37,7 @@
"dependencies": {
"dbgate-tools": "^6.0.0-alpha.1",
"lodash": "^4.17.21",
"dbgate-query-splitter": "^4.11.7"
"dbgate-query-splitter": "^4.11.9"
},
"optionalDependencies": {
"libsql": "0.5.0-pre.6",
+102 -1
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "Načítám plugin {plugin} ...",
"app.preparingPlugins": "Příprava pluginů...",
"app.starting": "Spouštění DbGate",
"cellDataWidget.autodetect": "Autodetekce - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Formát není vybrán",
"cellDataWidget.mustSelectOneCell": "Musí být vybrána jedna buňka",
"cellDataWidget.noDataSelected": "Nejsou vybrána žádná data",
"cellDataWidget.title": "Zobrazení dat buňky",
"chart.detect": "Rozpoznat graf",
"chart.open": "Otevřít graf",
"clipboard.SQLInsert": "SQL INSERT příkazy",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "Řídký",
"columnEditor.isUnsigned": "Bez znaménka",
"columnEditor.isZerofill": "Doplňování nul",
"columnLine.addReference": "Přidat referenci",
"columnLine.sortAscending": "Seřadit vzestupně",
"columnLine.sortDescending": "Seřadit sestupně",
"columnLine.unsort": "Zrušit řazení",
"columnsConstraintEditor.addNewColumn": "Přidat nový sloupec",
"columnsConstraintEditor.chooseColumn": "Vybrat sloupec",
"columnsConstraintEditor.selectColumn": "Vybrat sloupec",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "Zadejte požadovanou kombinaci kláves a stiskněte ENTER",
"common.addNew": "Přidat nový",
"common.advanced": "Pokročilé",
"common.allFields": "Všechny {field}",
"common.archive": "Archiv (JSONL)",
"common.cancel": "Zrušit",
"common.close": "Zavřít",
@@ -315,6 +325,7 @@
"common.kill": "Ukončit",
"common.loadingData": "Načítání dat",
"common.name": "Název",
"common.newConnection": "Nové připojení",
"common.notSelectedOptional": "(nezvoleno - volitelné)",
"common.parameters": "Parametry",
"common.passwordEncrypted": "Heslo je zašifrované",
@@ -324,6 +335,7 @@
"common.queryEditor": "Editor SQL dotazů",
"common.refresh": "Obnovit",
"common.remove": "Odstranit",
"common.removeAll": "Odstranit vše",
"common.reset": "Resetovat",
"common.save": "Uložit",
"common.saveAndNext": "Uložit a další",
@@ -331,6 +343,7 @@
"common.schema": "Schéma",
"common.search": "Hledat",
"common.searchBy": "Hledat podle:",
"common.server": "Server",
"common.sqlGenerator": "SQL Generátor",
"common.table": "Tabulka",
"common.testingConnection": "Testování připojení",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Triggery",
"dbObject.truncateTable": "Vyprázdnit tabulku",
"dbObject.views": "Pohledy",
"designerTable.addReferences": "Přidat reference",
"designerTable.changeColor": "Změnit barvu",
"designerTable.defineVirtualForeignKey": "Definovat virtuální cizí klíč",
"designerTable.newAlias": "Nový alias",
"designerTable.removeTableAlias": "Odstranit alias tabulky",
"designerTable.setTableAlias": "Nastavit alias tabulky",
"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",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Soubory návrháře dotazů",
"file.sqlFiles": "Soubory SQL",
"file.sqliteDatabase": "Databáze SQLite",
"files.allSupportedFiles": "Všechny podporované soubory",
"files.favorites": "Oblíbené",
"files.openFile": "Otevřít soubor",
"files.refreshFiles": "Obnovit soubory",
"files.savedFiles": "Uložené soubory",
"files.searchSavedFiles": "Hledat v uložených souborech",
"files.sqlFiles": "Soubory SQL",
"files.teamFiles": "Týmové soubory",
"files.uploadFile": "Nahrát soubor",
"filter.after": "Po...",
"filter.and": "A",
"filter.arrayIsEmpty": "Pole je prázdné",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Referenční sloupec - ",
"foreignKeyEditor.referencedTable": "Odkazovaná tabulka",
"foreignKeyEditor.tableNotSet": "(tabulka není nastavena)",
"history.queryHistory": "Historie dotazů",
"history.recentlyClosedTabs": "Nedávno zavřené karty",
"history.searchQueryHistory": "Hledat v historii dotazů",
"importExport.action": "Akce",
"importExport.addWebUrl": "Přidat webovou URL",
"importExport.advancedConfiguration": "Pokročilá konfigurace",
"importExport.archiveFolder": "Složka archivu",
"importExport.columns": "Sloupce",
"importExport.createZipFileInArchive": "Vytvořit ZIP soubor v archivu",
"importExport.currentArchive": "Aktuální archiv",
"importExport.currentDatabase": "Aktuální DB",
"importExport.dragDropImportedFilesHere": "Přetáhněte sem importované soubory",
"importExport.exportToZipArchive": "Exportovat do ZIP archivu",
"importExport.exportToZipFile": "Exportovat do ZIP souboru",
"importExport.generateScript": "Vygenerovat skript",
"importExport.importFromZipArchive": "Importovat z ZIP archivu",
"importExport.importFromZipFile": "Importovat z ZIP souboru (v archivní složce)",
"importExport.mapSourceTablesFiles": "Mapovat zdrojové tabulky/soubory",
"importExport.messages": "Zprávy",
"importExport.newArchive": "Nový archiv",
"importExport.outputFiles": "Výstupní soubory",
"importExport.preview": "Náhled",
"importExport.processingImportExport": "Zpracovávání importu/exportu ...",
"importExport.run": "Spustit",
"importExport.schedule": "Plán",
"importExport.source": "Zdroj",
"importExport.sourceConfiguration": "Konfigurace zdroje",
"importExport.sourceFiles": "Zdrojové soubory",
"importExport.startVariableIndex": "Počáteční index proměnné",
"importExport.status": "Stav",
"importExport.stop": "Zastavit",
"importExport.storageType": "Typ úložiště",
"importExport.tablesViewsCollections": "Tabulky / pohledy / kolekce",
"importExport.target": "Cíl",
"importExport.targetConfiguration": "Konfigurace cíle",
"indexEditor.filteredIndexCondition": "Podmínka filtrovaného indexu",
"indexEditor.indexName": "Název indexu",
"indexEditor.isUnique": "Je jedinečný index",
"logs.autoScroll": "Automatické posouvání",
"logs.caller": "Volající:",
"logs.callerTab": "Volající",
"logs.chooseDate": "Vyberte datum",
"logs.codeTab": "Kód",
"logs.connectionId": "ID připojení:",
"logs.connectionTab": "Připojení",
"logs.database": "Databáze:",
"logs.databaseTab": "Databáze",
"logs.date": "Datum:",
"logs.dateTab": "Datum",
"logs.details": "Detaily",
"logs.engine": "Engine:",
"logs.engineTab": "Engine",
"logs.loadingNextRows": "Načítání dalších řádků...",
"logs.message": "Zpráva:",
"logs.messageCode": "Kód zprávy:",
"logs.messageTab": "Zpráva",
"logs.name": "Název:",
"logs.nameTab": "Název",
"logs.noDataForSelectedDate": "Pro vybrané datum nejsou k dispozici žádná data",
"logs.recentLogs": "Nedávné logy",
"logs.refresh": "Obnovit",
"logs.time": "Čas:",
"logs.timeTab": "Čas",
"menu.edit": "Upravit",
"menu.file": "Soubor",
"menu.help": "Nápověda",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "SQL generátor není pro aktuální databázi k dispozici",
"newObject.tableDescription": "Vytvořit tabulku v aktuální databázi",
"newObject.tableDisabled": "Vytvoření tabulky není pro aktuální databázi k dispozici",
"plugins.searchExtensionsOnWeb": "Hledat rozšíření na webu",
"publicCloudWidget.onlyRelevantFilesListed": "Jsou zobrazeny pouze soubory relevantní pro vaše připojení, platformu a edici DbGate. Nejprve prosím definujte připojení.",
"publicCloudWidget.refreshFiles": "Obnovit soubory",
"publicCloudWidget.refreshList": "Obnovit seznam",
"publicCloudWidget.searchPublicFiles": "Hledat veřejné soubory",
"query.limitRows": "Omezit na {queryRowsLimit} řádků",
"query.named": ":proměnná",
"query.noParameters": "(žádné parametry)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Název sloupce",
"sqlObject.databaseEmpty": "Databáze {database} je prázdná nebo struktura není načtena, stiskněte tlačítko Obnovit pro znovunačtení struktury",
"sqlObject.loadingStructure": "Načítání struktury databáze",
"sqlObject.name": "Název",
"sqlObject.newCollection": "Nová kolekce/kontejner",
"sqlObject.rowCount": "Počet řádků",
"sqlObject.schemaName": "Schéma",
"sqlObject.search.placeholder": "Hledat v tabulkách, pohledech, procedurách",
"sqlObject.searchBy": "Hledat podle:",
"sqlObject.sizeBytes": "Velikost (bajty)",
"sqlObject.sortBy": "Seřadit podle:",
"sqlObject.tableComment": "Komentář tabulky",
"sqlObject.tableEngine": "Engine tabulky",
"sqlObject.tableViewProcedureName": "Název tabulky/pohledu/procedury",
@@ -902,6 +992,17 @@
"widget.keys": "Klíče",
"widget.pinned": "Připnuté",
"widget.tablesViewsFunctions": "Tabulky, pohledy, funkce",
"widgets.addNew": "Přidat nový",
"widgets.administration": "Administrace",
"widgets.archive": "Archiv (uložená tabulková data)",
"widgets.availableExtensions": "Dostupná rozšíření",
"widgets.databaseConnections": "Databázová připojení",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Oblíbené a uložené soubory",
"widgets.installedExtensions": "Nainstalovaná rozšíření",
"widgets.managePlugins": "Spravovat pluginy",
"widgets.premiumPromo": "Premium promo",
"widgets.queryHistoryAndClosedTabs": "Historie dotazů a zavřené karty",
"widgets.selectedCellDataDetailView": "Detailní zobrazení dat vybrané buňky",
"widgets.viewApplicationLogs": "Zobrazit aplikační logy"
}
}
+101
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "Lade Plugin {plugin} ...",
"app.preparingPlugins": "Plugins werden vorbereitet...",
"app.starting": "Starte DbGate",
"cellDataWidget.autodetect": "Automatisch erkennen - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Format nicht ausgewählt",
"cellDataWidget.mustSelectOneCell": "Es muss eine Zelle ausgewählt sein",
"cellDataWidget.noDataSelected": "Keine Daten ausgewählt",
"cellDataWidget.title": "Zell-Datenansicht",
"chart.detect": "Diagramm erkennen",
"chart.open": "Diagramm öffnen",
"clipboard.SQLInsert": "SQL INSERTs",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "Sparse",
"columnEditor.isUnsigned": "Vorzeichenlos",
"columnEditor.isZerofill": "Mit Nullen auffüllen",
"columnLine.addReference": "Referenz hinzufügen",
"columnLine.sortAscending": "Aufsteigend sortieren",
"columnLine.sortDescending": "Absteigend sortieren",
"columnLine.unsort": "Sortierung aufheben",
"columnsConstraintEditor.addNewColumn": "Neue Spalte hinzufügen",
"columnsConstraintEditor.chooseColumn": "Spalte auswählen",
"columnsConstraintEditor.selectColumn": "Spalte auswählen",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "Gewünschte Tastenkombination eingeben und ENTER drücken",
"common.addNew": "Neu hinzufügen",
"common.advanced": "Erweitert",
"common.allFields": "Alle {field}",
"common.archive": "Archiv (JSONL)",
"common.cancel": "Abbrechen",
"common.close": "Schließen",
@@ -315,6 +325,7 @@
"common.kill": "Beenden",
"common.loadingData": "Lade Daten",
"common.name": "Name",
"common.newConnection": "Neue Verbindung",
"common.notSelectedOptional": "(nicht ausgewählt - optional)",
"common.parameters": "Parameter",
"common.passwordEncrypted": "Passwort ist verschlüsselt",
@@ -324,6 +335,7 @@
"common.queryEditor": "SQL-Abfrage-Editor",
"common.refresh": "Aktualisieren",
"common.remove": "Entfernen",
"common.removeAll": "Alle entfernen",
"common.reset": "Zurücksetzen",
"common.save": "Speichern",
"common.saveAndNext": "Speichern und weiter",
@@ -331,6 +343,7 @@
"common.schema": "Schema",
"common.search": "Suchen",
"common.searchBy": "Suchen nach:",
"common.server": "Server",
"common.sqlGenerator": "SQL-Generator",
"common.table": "Tabelle",
"common.testingConnection": "Verbindung wird getestet",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Trigger",
"dbObject.truncateTable": "Tabelle leeren",
"dbObject.views": "Sichten",
"designerTable.addReferences": "Referenzen hinzufügen",
"designerTable.changeColor": "Farbe ändern",
"designerTable.defineVirtualForeignKey": "Virtuellen Fremdschlüssel definieren",
"designerTable.newAlias": "Neuer Alias",
"designerTable.removeTableAlias": "Tabellenalias entfernen",
"designerTable.setTableAlias": "Tabellenalias setzen",
"error.driverNotFound": "Ungültige Datenbankverbindung, Treiber nicht gefunden",
"error.selectedCloudConnection": "Ausgewählte Verbindung ist von DbGate Cloud",
"error.selectedNotCloudConnection": "Ausgewählte Verbindung ist nicht von DbGate Cloud",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Abfrage-Designer-Dateien",
"file.sqlFiles": "SQL-Dateien",
"file.sqliteDatabase": "SQLite-Datenbank",
"files.allSupportedFiles": "Alle unterstützten Dateien",
"files.favorites": "Favoriten",
"files.openFile": "Datei öffnen",
"files.refreshFiles": "Dateien aktualisieren",
"files.savedFiles": "Gespeicherte Dateien",
"files.searchSavedFiles": "Gespeicherte Dateien suchen",
"files.sqlFiles": "SQL-Dateien",
"files.teamFiles": "Team-Dateien",
"files.uploadFile": "Datei hochladen",
"filter.after": "Nach...",
"filter.and": "Und",
"filter.arrayIsEmpty": "Array ist leer",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Ref-Spalte - ",
"foreignKeyEditor.referencedTable": "Referenzierte Tabelle",
"foreignKeyEditor.tableNotSet": "(Tabelle nicht festgelegt)",
"history.queryHistory": "Abfrageverlauf",
"history.recentlyClosedTabs": "Kürzlich geschlossene Tabs",
"history.searchQueryHistory": "Abfrageverlauf durchsuchen",
"importExport.action": "Aktion",
"importExport.addWebUrl": "Web-URL hinzufügen",
"importExport.advancedConfiguration": "Erweiterte Konfiguration",
"importExport.archiveFolder": "Archivordner",
"importExport.columns": "Spalten",
"importExport.createZipFileInArchive": "ZIP-Datei im Archiv erstellen",
"importExport.currentArchive": "Aktuelles Archiv",
"importExport.currentDatabase": "Aktuelle DB",
"importExport.dragDropImportedFilesHere": "Importierte Dateien hierher ziehen und ablegen",
"importExport.exportToZipArchive": "In ZIP-Archiv exportieren",
"importExport.exportToZipFile": "In ZIP-Datei exportieren",
"importExport.generateScript": "Skript generieren",
"importExport.importFromZipArchive": "Aus ZIP-Archiv importieren",
"importExport.importFromZipFile": "Aus ZIP-Datei importieren (im Archivordner)",
"importExport.mapSourceTablesFiles": "Quelltabellen/-dateien zuordnen",
"importExport.messages": "Meldungen",
"importExport.newArchive": "Neues Archiv",
"importExport.outputFiles": "Ausgabedateien",
"importExport.preview": "Vorschau",
"importExport.processingImportExport": "Import/Export wird verarbeitet ...",
"importExport.run": "Ausführen",
"importExport.schedule": "Zeitplan",
"importExport.source": "Quelle",
"importExport.sourceConfiguration": "Quellenkonfiguration",
"importExport.sourceFiles": "Quelldateien",
"importExport.startVariableIndex": "Startvariablenindex",
"importExport.status": "Status",
"importExport.stop": "Stopp",
"importExport.storageType": "Speichertyp",
"importExport.tablesViewsCollections": "Tabellen / Sichten / Sammlungen",
"importExport.target": "Ziel",
"importExport.targetConfiguration": "Zielkonfiguration",
"indexEditor.filteredIndexCondition": "Gefilterte Index-Bedingung",
"indexEditor.indexName": "Index-Name",
"indexEditor.isUnique": "Ist eindeutiger Index",
"logs.autoScroll": "Automatisches Scrollen",
"logs.caller": "Aufrufer:",
"logs.callerTab": "Aufrufer",
"logs.chooseDate": "Datum auswählen",
"logs.codeTab": "Code",
"logs.connectionId": "Verbindungs-ID:",
"logs.connectionTab": "Verbindung",
"logs.database": "Datenbank:",
"logs.databaseTab": "Datenbank",
"logs.date": "Datum:",
"logs.dateTab": "Datum",
"logs.details": "Details",
"logs.engine": "Engine:",
"logs.engineTab": "Engine",
"logs.loadingNextRows": "Lade nächste Zeilen...",
"logs.message": "Nachricht:",
"logs.messageCode": "Nachrichtencode:",
"logs.messageTab": "Nachricht",
"logs.name": "Name:",
"logs.nameTab": "Name",
"logs.noDataForSelectedDate": "Keine Daten für ausgewähltes Datum",
"logs.recentLogs": "Letzte Protokolle",
"logs.refresh": "Aktualisieren",
"logs.time": "Zeit:",
"logs.timeTab": "Zeit",
"menu.edit": "Bearbeiten",
"menu.file": "Datei",
"menu.help": "Hilfe",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "SQL-Generator ist für aktuelle Datenbank nicht verfügbar",
"newObject.tableDescription": "Tabelle in der aktuellen Datenbank erstellen",
"newObject.tableDisabled": "Tabellenerstellung ist für aktuelle Datenbank nicht verfügbar",
"plugins.searchExtensionsOnWeb": "Erweiterungen im Web suchen",
"publicCloudWidget.onlyRelevantFilesListed": "Es werden nur Dateien aufgelistet, die für Ihre Verbindungen, Plattform und DbGate-Edition relevant sind. Bitte definieren Sie zuerst Verbindungen.",
"publicCloudWidget.refreshFiles": "Dateien aktualisieren",
"publicCloudWidget.refreshList": "Liste aktualisieren",
"publicCloudWidget.searchPublicFiles": "Öffentliche Dateien suchen",
"query.limitRows": "Auf {queryRowsLimit} Zeilen begrenzen",
"query.named": ":Variable",
"query.noParameters": "(keine Parameter)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Spaltenname",
"sqlObject.databaseEmpty": "Datenbank {database} ist leer oder Struktur ist nicht geladen, drücken Sie die Schaltfläche Aktualisieren, um die Struktur neu zu laden",
"sqlObject.loadingStructure": "Lade Datenbankstruktur",
"sqlObject.name": "Name",
"sqlObject.newCollection": "Neue Sammlung/Container",
"sqlObject.rowCount": "Zeilenanzahl",
"sqlObject.schemaName": "Schema",
"sqlObject.search.placeholder": "In Tabellen, Ansichten, Prozeduren suchen",
"sqlObject.searchBy": "Suchen nach:",
"sqlObject.sizeBytes": "Größe (Bytes)",
"sqlObject.sortBy": "Sortieren nach:",
"sqlObject.tableComment": "Tabellenkommentar",
"sqlObject.tableEngine": "Tabellen-Engine",
"sqlObject.tableViewProcedureName": "Name von Tabelle/Ansicht/Prozedur",
@@ -902,6 +992,17 @@
"widget.keys": "Schlüssel",
"widget.pinned": "Angeheftet",
"widget.tablesViewsFunctions": "Tabellen, Ansichten, Funktionen",
"widgets.addNew": "Neu hinzufügen",
"widgets.administration": "Administration",
"widgets.archive": "Archiv (gespeicherte tabellarische Daten)",
"widgets.availableExtensions": "Verfügbare Erweiterungen",
"widgets.databaseConnections": "Datenbankverbindungen",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Favoriten & gespeicherte Dateien",
"widgets.installedExtensions": "Installierte Erweiterungen",
"widgets.managePlugins": "Plugins verwalten",
"widgets.premiumPromo": "Premium-Werbung",
"widgets.queryHistoryAndClosedTabs": "Abfrageverlauf & geschlossene Tabs",
"widgets.selectedCellDataDetailView": "Detailansicht der ausgewählten Zelldaten",
"widgets.viewApplicationLogs": "Anwendungsprotokolle anzeigen"
}
+102 -1
View File
@@ -3,7 +3,11 @@
"app.loading_plugin": "Loading plugin {plugin} ...",
"app.preparingPlugins": "Preparing plugins ...",
"app.starting": "Starting DbGate",
"connection.authToken": "Auth token",
"cellDataWidget.autodetect": "Autodetect - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Format not selected",
"cellDataWidget.mustSelectOneCell": "Must be selected one cell",
"cellDataWidget.noDataSelected": "No data selected",
"cellDataWidget.title": "Cell data view",
"chart.detect": "Detect chart",
"chart.open": "Open chart",
"clipboard.SQLInsert": "SQL INSERTs",
@@ -41,6 +45,10 @@
"columnEditor.isSparse": "Sparse",
"columnEditor.isUnsigned": "Unsigned",
"columnEditor.isZerofill": "Zero fill",
"columnLine.addReference": "Add reference",
"columnLine.sortAscending": "Sort ascending",
"columnLine.sortDescending": "Sort descending",
"columnLine.unsort": "Unsort",
"columnsConstraintEditor.addNewColumn": "Add new column",
"columnsConstraintEditor.chooseColumn": "Choose column",
"columnsConstraintEditor.selectColumn": "Select column",
@@ -290,6 +298,7 @@
"commandModal.showKeyCombination": "Show desired key combination and press ENTER",
"common.addNew": "Add new",
"common.advanced": "Advanced",
"common.allFields": "All {field}",
"common.archive": "Archive (JSONL)",
"common.cancel": "Cancel",
"common.close": "Close",
@@ -316,6 +325,7 @@
"common.kill": "Kill",
"common.loadingData": "Loading data",
"common.name": "Name",
"common.newConnection": "New Connection",
"common.notSelectedOptional": "(not selected - optional)",
"common.parameters": "Parameters",
"common.passwordEncrypted": "Password is encrypted",
@@ -325,6 +335,7 @@
"common.queryEditor": "SQL query editor",
"common.refresh": "Refresh",
"common.remove": "Remove",
"common.removeAll": "Remove all",
"common.reset": "Reset",
"common.save": "Save",
"common.saveAndNext": "Save and next",
@@ -332,6 +343,7 @@
"common.schema": "Schema",
"common.search": "Search",
"common.searchBy": "Search by:",
"common.server": "Server",
"common.sqlGenerator": "SQL Generator",
"common.table": "Table",
"common.testingConnection": "Testing connection",
@@ -340,6 +352,7 @@
"connection.allowedDatabasesRegex": "Allowed databases regular expression",
"connection.askPassword": "Don't save, ask for password",
"connection.askUser": "Don't save, ask for login and password",
"connection.authToken": "Auth token",
"connection.authentication": "Authentication",
"connection.autoDetectNatMap": "Auto detect NAT map (use for Redis Cluster in Docker network)",
"connection.chooseType": "Choose type",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Triggers",
"dbObject.truncateTable": "Truncate table",
"dbObject.views": "Views",
"designerTable.addReferences": "Add references",
"designerTable.changeColor": "Change color",
"designerTable.defineVirtualForeignKey": "Define virtual foreign key",
"designerTable.newAlias": "New alias",
"designerTable.removeTableAlias": "Remove table alias",
"designerTable.setTableAlias": "Set table alias",
"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",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Query designer files",
"file.sqlFiles": "SQL files",
"file.sqliteDatabase": "SQLite database",
"files.allSupportedFiles": "All supported files",
"files.favorites": "Favorites",
"files.openFile": "Open file",
"files.refreshFiles": "Refresh files",
"files.savedFiles": "Saved files",
"files.searchSavedFiles": "Search saved files",
"files.sqlFiles": "SQL files",
"files.teamFiles": "Team files",
"files.uploadFile": "Upload file",
"filter.after": "After...",
"filter.and": "And",
"filter.arrayIsEmpty": "Array is empty",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Ref column - ",
"foreignKeyEditor.referencedTable": "Referenced table",
"foreignKeyEditor.tableNotSet": "(table not set)",
"history.queryHistory": "Query history",
"history.recentlyClosedTabs": "Recently closed tabs",
"history.searchQueryHistory": "Search query history",
"importExport.action": "Action",
"importExport.addWebUrl": "Add web URL",
"importExport.advancedConfiguration": "Advanced configuration",
"importExport.archiveFolder": "Archive folder",
"importExport.columns": "Columns",
"importExport.createZipFileInArchive": "Create ZIP file in archive",
"importExport.currentArchive": "Current archive",
"importExport.currentDatabase": "Current DB",
"importExport.dragDropImportedFilesHere": "Drag & drop imported files here",
"importExport.exportToZipArchive": "Output ZIP archive",
"importExport.exportToZipFile": "Export to ZIP file",
"importExport.generateScript": "Generate script",
"importExport.importFromZipArchive": "Input ZIP archive",
"importExport.importFromZipFile": "Import from ZIP file (in archive folder)",
"importExport.mapSourceTablesFiles": "Map source tables/files",
"importExport.messages": "Messages",
"importExport.newArchive": "New archive",
"importExport.outputFiles": "Output files",
"importExport.preview": "Preview",
"importExport.processingImportExport": "Processing import/export ...",
"importExport.run": "Run",
"importExport.schedule": "Schedule",
"importExport.source": "Source",
"importExport.sourceConfiguration": "Source configuration",
"importExport.sourceFiles": "Source files",
"importExport.startVariableIndex": "Start variable index",
"importExport.status": "Status",
"importExport.stop": "Stop",
"importExport.storageType": "Storage type",
"importExport.tablesViewsCollections": "Tables / views / collections",
"importExport.target": "Target",
"importExport.targetConfiguration": "Target configuration",
"indexEditor.filteredIndexCondition": "Filtered index condition",
"indexEditor.indexName": "Index name",
"indexEditor.isUnique": "Is unique index",
"logs.autoScroll": "Auto-scroll",
"logs.caller": "Caller:",
"logs.callerTab": "Caller",
"logs.chooseDate": "Choose date",
"logs.codeTab": "Code",
"logs.connectionId": "Connection ID:",
"logs.connectionTab": "Connection",
"logs.database": "Database:",
"logs.databaseTab": "Database",
"logs.date": "Date:",
"logs.dateTab": "Date",
"logs.details": "Details",
"logs.engine": "Engine:",
"logs.engineTab": "Engine",
"logs.loadingNextRows": "Loading next rows...",
"logs.message": "Message:",
"logs.messageCode": "Message code:",
"logs.messageTab": "Message",
"logs.name": "Name:",
"logs.nameTab": "Name",
"logs.noDataForSelectedDate": "No data for selected date",
"logs.recentLogs": "Recent logs",
"logs.refresh": "Refresh",
"logs.time": "Time:",
"logs.timeTab": "Time",
"menu.edit": "Edit",
"menu.file": "File",
"menu.help": "Help",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "SQL Generator is not available for current database",
"newObject.tableDescription": "Create table in the current database",
"newObject.tableDisabled": "Table creation is not available for current database",
"plugins.searchExtensionsOnWeb": "Search extensions on web",
"publicCloudWidget.onlyRelevantFilesListed": "Only files relevant for your connections, platform and DbGate edition are listed. Please define connections at first.",
"publicCloudWidget.refreshFiles": "Refresh files",
"publicCloudWidget.refreshList": "Refresh list",
"publicCloudWidget.searchPublicFiles": "Search public files",
"query.limitRows": "Limit {queryRowsLimit} rows",
"query.named": ":variable",
"query.noParameters": "(no parameters)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Column name",
"sqlObject.databaseEmpty": "Database {database} is empty or structure is not loaded, press Refresh button to reload structure",
"sqlObject.loadingStructure": "Loading database structure",
"sqlObject.name": "Name",
"sqlObject.newCollection": "New collection/container",
"sqlObject.rowCount": "Row count",
"sqlObject.schemaName": "Schema",
"sqlObject.search.placeholder": "Search in tables, views, procedures",
"sqlObject.searchBy": "Search by:",
"sqlObject.sizeBytes": "Size (bytes)",
"sqlObject.sortBy": "Sort by:",
"sqlObject.tableComment": "Table comment",
"sqlObject.tableEngine": "Table engine",
"sqlObject.tableViewProcedureName": "Table/view/procedure name",
@@ -902,6 +992,17 @@
"widget.keys": "Keys",
"widget.pinned": "Pinned",
"widget.tablesViewsFunctions": "Tables, views, functions",
"widgets.addNew": "Add New",
"widgets.administration": "Administration",
"widgets.archive": "Archive (saved tabular data)",
"widgets.availableExtensions": "Available extensions",
"widgets.databaseConnections": "Database connections",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Favorites & Saved files",
"widgets.installedExtensions": "Installed extensions",
"widgets.managePlugins": "Manage plugins",
"widgets.premiumPromo": "Premium promo",
"widgets.queryHistoryAndClosedTabs": "Query history & Closed tabs",
"widgets.selectedCellDataDetailView": "Selected cell data detail view",
"widgets.viewApplicationLogs": "View application logs"
}
+101
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "Cargando plugin {plugin} ...",
"app.preparingPlugins": "Preparando plugins ...",
"app.starting": "Iniciando DbGate",
"cellDataWidget.autodetect": "Detección automática - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Formato no seleccionado",
"cellDataWidget.mustSelectOneCell": "Debe seleccionarse una celda",
"cellDataWidget.noDataSelected": "No hay datos seleccionados",
"cellDataWidget.title": "Vista de datos de celda",
"chart.detect": "Detectar gráfico",
"chart.open": "Abrir gráfico",
"clipboard.SQLInsert": "SQL INSERTs",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "Dispersa",
"columnEditor.isUnsigned": "Sin signo",
"columnEditor.isZerofill": "Relleno con ceros",
"columnLine.addReference": "Agregar referencia",
"columnLine.sortAscending": "Ordenar ascendente",
"columnLine.sortDescending": "Ordenar descendente",
"columnLine.unsort": "Quitar orden",
"columnsConstraintEditor.addNewColumn": "Agregar nueva columna",
"columnsConstraintEditor.chooseColumn": "Elegir columna",
"columnsConstraintEditor.selectColumn": "Seleccionar columna",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "Muestre la combinación de teclas deseada y presione ENTER",
"common.addNew": "Agregar nuevo",
"common.advanced": "Avanzado",
"common.allFields": "Todos {field}",
"common.archive": "Archivo (JSONL)",
"common.cancel": "Cancelar",
"common.close": "Cerrar",
@@ -315,6 +325,7 @@
"common.kill": "Terminar",
"common.loadingData": "Cargando datos",
"common.name": "Nombre",
"common.newConnection": "Nueva conexión",
"common.notSelectedOptional": "(no seleccionado - opcional)",
"common.parameters": "Parámetros",
"common.passwordEncrypted": "La contraseña está encriptada",
@@ -324,6 +335,7 @@
"common.queryEditor": "Editor de consultas SQL",
"common.refresh": "Refrescar",
"common.remove": "Eliminar",
"common.removeAll": "Eliminar todo",
"common.reset": "Restablecer",
"common.save": "Guardar",
"common.saveAndNext": "Guardar y siguiente",
@@ -331,6 +343,7 @@
"common.schema": "Esquema",
"common.search": "Buscar",
"common.searchBy": "Buscar por:",
"common.server": "Servidor",
"common.sqlGenerator": "Generador SQL",
"common.table": "Tabla",
"common.testingConnection": "Probando conexión",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Disparadores",
"dbObject.truncateTable": "Truncar tabla",
"dbObject.views": "Vistas",
"designerTable.addReferences": "Agregar referencias",
"designerTable.changeColor": "Cambiar color",
"designerTable.defineVirtualForeignKey": "Definir clave foránea virtual",
"designerTable.newAlias": "Nuevo alias",
"designerTable.removeTableAlias": "Eliminar alias de tabla",
"designerTable.setTableAlias": "Establecer alias de tabla",
"error.driverNotFound": "Conexión de base de datos inválida, controlador no encontrado",
"error.selectedCloudConnection": "La conexión seleccionada es de la nube de DbGate",
"error.selectedNotCloudConnection": "La conexión seleccionada no es de la nube de DbGate",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Archivos de diseñador de consultas",
"file.sqlFiles": "Archivos SQL",
"file.sqliteDatabase": "Base de datos SQLite",
"files.allSupportedFiles": "Todos los archivos soportados",
"files.favorites": "Favoritos",
"files.openFile": "Abrir archivo",
"files.refreshFiles": "Refrescar archivos",
"files.savedFiles": "Archivos guardados",
"files.searchSavedFiles": "Buscar archivos guardados",
"files.sqlFiles": "Archivos SQL",
"files.teamFiles": "Archivos de equipo",
"files.uploadFile": "Subir archivo",
"filter.after": "Después de...",
"filter.and": "Y",
"filter.arrayIsEmpty": "El arreglo está vacío",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Columna ref - ",
"foreignKeyEditor.referencedTable": "Tabla referenciada",
"foreignKeyEditor.tableNotSet": "(tabla no establecida)",
"history.queryHistory": "Historial de consultas",
"history.recentlyClosedTabs": "Pestañas cerradas recientemente",
"history.searchQueryHistory": "Buscar en historial de consultas",
"importExport.action": "Acción",
"importExport.addWebUrl": "Agregar URL web",
"importExport.advancedConfiguration": "Configuración avanzada",
"importExport.archiveFolder": "Carpeta de archivo",
"importExport.columns": "Columnas",
"importExport.createZipFileInArchive": "Crear archivo ZIP en el archivo",
"importExport.currentArchive": "Archivo actual",
"importExport.currentDatabase": "BD actual",
"importExport.dragDropImportedFilesHere": "Arrastre y suelte aquí los archivos importados",
"importExport.exportToZipArchive": "Archivo ZIP de salida",
"importExport.exportToZipFile": "Exportar a archivo ZIP",
"importExport.generateScript": "Generar script",
"importExport.importFromZipArchive": "Archivo ZIP de entrada",
"importExport.importFromZipFile": "Importar desde archivo ZIP (en carpeta de archivo)",
"importExport.mapSourceTablesFiles": "Mapear tablas/archivos de origen",
"importExport.messages": "Mensajes",
"importExport.newArchive": "Nuevo archivo",
"importExport.outputFiles": "Archivos de salida",
"importExport.preview": "Vista previa",
"importExport.processingImportExport": "Procesando importación/exportación ...",
"importExport.run": "Ejecutar",
"importExport.schedule": "Programar",
"importExport.source": "Origen",
"importExport.sourceConfiguration": "Configuración de origen",
"importExport.sourceFiles": "Archivos de origen",
"importExport.startVariableIndex": "Índice inicial de variable",
"importExport.status": "Estado",
"importExport.stop": "Detener",
"importExport.storageType": "Tipo de almacenamiento",
"importExport.tablesViewsCollections": "Tablas / vistas / colecciones",
"importExport.target": "Destino",
"importExport.targetConfiguration": "Configuración de destino",
"indexEditor.filteredIndexCondition": "Condición de índice filtrado",
"indexEditor.indexName": "Nombre de índice",
"indexEditor.isUnique": "Es índice único",
"logs.autoScroll": "Desplazamiento automático",
"logs.caller": "Llamador:",
"logs.callerTab": "Llamador",
"logs.chooseDate": "Elegir fecha",
"logs.codeTab": "Código",
"logs.connectionId": "ID de conexión:",
"logs.connectionTab": "Conexión",
"logs.database": "Base de datos:",
"logs.databaseTab": "Base de datos",
"logs.date": "Fecha:",
"logs.dateTab": "Fecha",
"logs.details": "Detalles",
"logs.engine": "Motor:",
"logs.engineTab": "Motor",
"logs.loadingNextRows": "Cargando siguientes filas...",
"logs.message": "Mensaje:",
"logs.messageCode": "Código de mensaje:",
"logs.messageTab": "Mensaje",
"logs.name": "Nombre:",
"logs.nameTab": "Nombre",
"logs.noDataForSelectedDate": "No hay datos para la fecha seleccionada",
"logs.recentLogs": "Registros recientes",
"logs.refresh": "Refrescar",
"logs.time": "Hora:",
"logs.timeTab": "Hora",
"menu.edit": "Editar",
"menu.file": "Archivo",
"menu.help": "Ayuda",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "El generador SQL no está disponible para la base de datos actual",
"newObject.tableDescription": "Crear tabla en la base de datos actual",
"newObject.tableDisabled": "La creación de tablas no está disponible para la base de datos actual",
"plugins.searchExtensionsOnWeb": "Buscar extensiones en la web",
"publicCloudWidget.onlyRelevantFilesListed": "Solo se listan archivos relevantes para sus conexiones, plataforma y edición de DbGate. Defina primero las conexiones.",
"publicCloudWidget.refreshFiles": "Refrescar archivos",
"publicCloudWidget.refreshList": "Refrescar lista",
"publicCloudWidget.searchPublicFiles": "Buscar archivos públicos",
"query.limitRows": "Limitar {queryRowsLimit} filas",
"query.named": ":variable",
"query.noParameters": "(sin parámetros)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Nombre de columna",
"sqlObject.databaseEmpty": "La base de datos {database} está vacía o la estructura no está cargada, presione el botón Refrescar para recargar la estructura",
"sqlObject.loadingStructure": "Cargando estructura de base de datos",
"sqlObject.name": "Nombre",
"sqlObject.newCollection": "Nueva colección/contenedor",
"sqlObject.rowCount": "Recuento de filas",
"sqlObject.schemaName": "Esquema",
"sqlObject.search.placeholder": "Buscar en tablas, vistas, procedimientos",
"sqlObject.searchBy": "Buscar por:",
"sqlObject.sizeBytes": "Tamaño (bytes)",
"sqlObject.sortBy": "Ordenar por:",
"sqlObject.tableComment": "Comentario de tabla",
"sqlObject.tableEngine": "Motor de tabla",
"sqlObject.tableViewProcedureName": "Nombre de tabla/vista/procedimiento",
@@ -902,6 +992,17 @@
"widget.keys": "Claves",
"widget.pinned": "Anclado",
"widget.tablesViewsFunctions": "Tablas, vistas, funciones",
"widgets.addNew": "Agregar nuevo",
"widgets.administration": "Administración",
"widgets.archive": "Archivo (datos tabulares guardados)",
"widgets.availableExtensions": "Extensiones disponibles",
"widgets.databaseConnections": "Conexiones de base de datos",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Favoritos y archivos guardados",
"widgets.installedExtensions": "Extensiones instaladas",
"widgets.managePlugins": "Administrar plugins",
"widgets.premiumPromo": "Promoción Premium",
"widgets.queryHistoryAndClosedTabs": "Historial de consultas y pestañas cerradas",
"widgets.selectedCellDataDetailView": "Vista detallada de datos de celda seleccionada",
"widgets.viewApplicationLogs": "Ver registros de la aplicación"
}
+101
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "Chargement du plugin {plugin}...",
"app.preparingPlugins": "Préparation des plugins...",
"app.starting": "Démarrage de DbGate",
"cellDataWidget.autodetect": "Détection automatique - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Format non sélectionné",
"cellDataWidget.mustSelectOneCell": "Une seule cellule doit être sélectionnée",
"cellDataWidget.noDataSelected": "Aucune donnée sélectionnée",
"cellDataWidget.title": "Vue des données de cellule",
"chart.detect": "Détecter le graphique",
"chart.open": "Ouvrir le graphique",
"clipboard.SQLInsert": "INSERT SQL",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "Sparse",
"columnEditor.isUnsigned": "Non signé",
"columnEditor.isZerofill": "Remplissage de zéros",
"columnLine.addReference": "Ajouter une référence",
"columnLine.sortAscending": "Trier par ordre croissant",
"columnLine.sortDescending": "Trier par ordre décroissant",
"columnLine.unsort": "Annuler le tri",
"columnsConstraintEditor.addNewColumn": "Ajouter une nouvelle colonne",
"columnsConstraintEditor.chooseColumn": "Choisir une colonne",
"columnsConstraintEditor.selectColumn": "Sélectionner une colonne",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "Afficher la combinaison de touches souhaitée et appuyez sur ENTRÉE",
"common.addNew": "Ajouter un nouvel élément",
"common.advanced": "Avancé",
"common.allFields": "Tous les {field}",
"common.archive": "Archive (JSONL)",
"common.cancel": "Annuler",
"common.close": "Fermer",
@@ -315,6 +325,7 @@
"common.kill": "Tuer",
"common.loadingData": "Chargement des données",
"common.name": "Nom",
"common.newConnection": "Nouvelle connexion",
"common.notSelectedOptional": "(non sélectionné - optionnel)",
"common.parameters": "Paramètres",
"common.passwordEncrypted": "Le mot de passe est chiffré",
@@ -324,6 +335,7 @@
"common.queryEditor": "Éditeur de requêtes SQL",
"common.refresh": "Rafraîchir",
"common.remove": "Supprimer",
"common.removeAll": "Tout supprimer",
"common.reset": "Réinitialiser",
"common.save": "Enregistrer",
"common.saveAndNext": "Enregistrer et passer au suivant",
@@ -331,6 +343,7 @@
"common.schema": "Schéma",
"common.search": "Rechercher",
"common.searchBy": "Rechercher par :",
"common.server": "Serveur",
"common.sqlGenerator": "Générateur SQL",
"common.table": "Table",
"common.testingConnection": "Test de connexion",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Déclencheurs",
"dbObject.truncateTable": "Tronquer la table",
"dbObject.views": "Vues",
"designerTable.addReferences": "Ajouter des références",
"designerTable.changeColor": "Changer la couleur",
"designerTable.defineVirtualForeignKey": "Définir une clé étrangère virtuelle",
"designerTable.newAlias": "Nouvel alias",
"designerTable.removeTableAlias": "Supprimer l'alias de table",
"designerTable.setTableAlias": "Définir l'alias de table",
"error.driverNotFound": "Connexion de base de données non valide, pilote introuvable",
"error.selectedCloudConnection": "La connexion sélectionnée provient du cloud DbGate",
"error.selectedNotCloudConnection": "La connexion sélectionnée ne provient pas du cloud DbGate",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Fichiers du concepteur de requêtes",
"file.sqlFiles": "Fichiers SQL",
"file.sqliteDatabase": "Base de données SQLite",
"files.allSupportedFiles": "Tous les fichiers pris en charge",
"files.favorites": "Favoris",
"files.openFile": "Ouvrir le fichier",
"files.refreshFiles": "Rafraîchir les fichiers",
"files.savedFiles": "Fichiers enregistrés",
"files.searchSavedFiles": "Rechercher dans les fichiers enregistrés",
"files.sqlFiles": "Fichiers SQL",
"files.teamFiles": "Fichiers d'équipe",
"files.uploadFile": "Téléverser un fichier",
"filter.after": "Après...",
"filter.and": "Et",
"filter.arrayIsEmpty": "Le tableau est vide",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Colonne réf. - ",
"foreignKeyEditor.referencedTable": "Table référencée",
"foreignKeyEditor.tableNotSet": "(table non définie)",
"history.queryHistory": "Historique des requêtes",
"history.recentlyClosedTabs": "Onglets récemment fermés",
"history.searchQueryHistory": "Rechercher dans l'historique des requêtes",
"importExport.action": "Action",
"importExport.addWebUrl": "Ajouter une URL web",
"importExport.advancedConfiguration": "Configuration avancée",
"importExport.archiveFolder": "Dossier d'archive",
"importExport.columns": "Colonnes",
"importExport.createZipFileInArchive": "Créer un fichier ZIP dans l'archive",
"importExport.currentArchive": "Archive actuelle",
"importExport.currentDatabase": "BD actuelle",
"importExport.dragDropImportedFilesHere": "Glissez-déposez les fichiers importés ici",
"importExport.exportToZipArchive": "Archive ZIP de sortie",
"importExport.exportToZipFile": "Exporter vers un fichier ZIP",
"importExport.generateScript": "Générer un script",
"importExport.importFromZipArchive": "Archive ZIP d'entrée",
"importExport.importFromZipFile": "Importer depuis un fichier ZIP (dans le dossier d'archive)",
"importExport.mapSourceTablesFiles": "Mapper les tables/fichiers source",
"importExport.messages": "Messages",
"importExport.newArchive": "Nouvelle archive",
"importExport.outputFiles": "Fichiers de sortie",
"importExport.preview": "Aperçu",
"importExport.processingImportExport": "Traitement de l'import/export...",
"importExport.run": "Exécuter",
"importExport.schedule": "Planifier",
"importExport.source": "Source",
"importExport.sourceConfiguration": "Configuration de la source",
"importExport.sourceFiles": "Fichiers source",
"importExport.startVariableIndex": "Index de variable de départ",
"importExport.status": "Statut",
"importExport.stop": "Arrêter",
"importExport.storageType": "Type de stockage",
"importExport.tablesViewsCollections": "Tables / vues / collections",
"importExport.target": "Cible",
"importExport.targetConfiguration": "Configuration de la cible",
"indexEditor.filteredIndexCondition": "Condition d'index filtré",
"indexEditor.indexName": "Nom de l'index",
"indexEditor.isUnique": "Est un index unique",
"logs.autoScroll": "Défilement automatique",
"logs.caller": "Appelant :",
"logs.callerTab": "Appelant",
"logs.chooseDate": "Choisir la date",
"logs.codeTab": "Code",
"logs.connectionId": "ID de connexion :",
"logs.connectionTab": "Connexion",
"logs.database": "Base de données :",
"logs.databaseTab": "Base de données",
"logs.date": "Date :",
"logs.dateTab": "Date",
"logs.details": "Détails",
"logs.engine": "Moteur :",
"logs.engineTab": "Moteur",
"logs.loadingNextRows": "Chargement des lignes suivantes...",
"logs.message": "Message :",
"logs.messageCode": "Code du message :",
"logs.messageTab": "Message",
"logs.name": "Nom :",
"logs.nameTab": "Nom",
"logs.noDataForSelectedDate": "Aucune donnée pour la date sélectionnée",
"logs.recentLogs": "Journaux récents",
"logs.refresh": "Rafraîchir",
"logs.time": "Heure :",
"logs.timeTab": "Heure",
"menu.edit": "Modifier",
"menu.file": "Fichier",
"menu.help": "Aide",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "Le générateur SQL n'est pas disponible pour la base de données actuelle",
"newObject.tableDescription": "Créer une table dans la base de données actuelle",
"newObject.tableDisabled": "La création de table n'est pas disponible pour la base de données actuelle",
"plugins.searchExtensionsOnWeb": "Rechercher des extensions sur le web",
"publicCloudWidget.onlyRelevantFilesListed": "Seuls les fichiers pertinents pour vos connexions, votre plateforme et votre édition de DbGate sont listés. Veuillez d'abord définir des connexions.",
"publicCloudWidget.refreshFiles": "Rafraîchir les fichiers",
"publicCloudWidget.refreshList": "Rafraîchir la liste",
"publicCloudWidget.searchPublicFiles": "Rechercher des fichiers publics",
"query.limitRows": "Limiter à {queryRowsLimit} lignes",
"query.named": ":variable",
"query.noParameters": "(aucun paramètre)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Nom de colonne",
"sqlObject.databaseEmpty": "La base de données {database} est vide ou la structure n'est pas chargée, appuyez sur le bouton Rafraîchir pour recharger la structure",
"sqlObject.loadingStructure": "Chargement de la structure de la base de données",
"sqlObject.name": "Nom",
"sqlObject.newCollection": "Nouvelle collection/conteneur",
"sqlObject.rowCount": "Nombre de lignes",
"sqlObject.schemaName": "Schéma",
"sqlObject.search.placeholder": "Rechercher dans les tables, vues, procédures",
"sqlObject.searchBy": "Rechercher par :",
"sqlObject.sizeBytes": "Taille (octets)",
"sqlObject.sortBy": "Trier par :",
"sqlObject.tableComment": "Commentaire de table",
"sqlObject.tableEngine": "Moteur de table",
"sqlObject.tableViewProcedureName": "Nom de table/vue/procédure",
@@ -902,6 +992,17 @@
"widget.keys": "Clés",
"widget.pinned": "Épinglé",
"widget.tablesViewsFunctions": "Tables, vues, fonctions",
"widgets.addNew": "Ajouter un nouvel élément",
"widgets.administration": "Administration",
"widgets.archive": "Archive (données tabulaires enregistrées)",
"widgets.availableExtensions": "Extensions disponibles",
"widgets.databaseConnections": "Connexions de base de données",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Favoris et fichiers enregistrés",
"widgets.installedExtensions": "Extensions installées",
"widgets.managePlugins": "Gérer les plugins",
"widgets.premiumPromo": "Promotion Premium",
"widgets.queryHistoryAndClosedTabs": "Historique des requêtes et onglets fermés",
"widgets.selectedCellDataDetailView": "Vue détaillée des données de la cellule sélectionnée",
"widgets.viewApplicationLogs": "Afficher les journaux de l'application"
}
+1008
View File
File diff suppressed because it is too large Load Diff
+1008
View File
File diff suppressed because it is too large Load Diff
+1008
View File
File diff suppressed because it is too large Load Diff
+102 -1
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "Načítavam plugin {plugin} ...",
"app.preparingPlugins": "Príprava pluginov...",
"app.starting": "Spúšťam DbGate",
"cellDataWidget.autodetect": "Autodetekcia - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "Formát nie je zvolený",
"cellDataWidget.mustSelectOneCell": "Musí byť vybraná jedna bunka",
"cellDataWidget.noDataSelected": "Nie sú vybrané žiadne dáta",
"cellDataWidget.title": "Zobrazenie dát bunky",
"chart.detect": "Rozpoznať graf",
"chart.open": "Otvoriť graf",
"clipboard.SQLInsert": "SQL INSERT príkazy",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "Riedky",
"columnEditor.isUnsigned": "Bez znamienka",
"columnEditor.isZerofill": "Výplň nulami",
"columnLine.addReference": "Pridať referenciu",
"columnLine.sortAscending": "Zoradiť vzostupne",
"columnLine.sortDescending": "Zoradiť zostupne",
"columnLine.unsort": "Zrušiť zoradenie",
"columnsConstraintEditor.addNewColumn": "Pridať nový stĺpec",
"columnsConstraintEditor.chooseColumn": "Vybrať stĺpec",
"columnsConstraintEditor.selectColumn": "Vybrať stĺpec",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "Zobraziť požadovanú klávesovú kombináciu a stlačiť ENTER",
"common.addNew": "Pridať nový",
"common.advanced": "Pokročilé",
"common.allFields": "Všetky {field}",
"common.archive": "Archivovať (JSONL)",
"common.cancel": "Zrušiť",
"common.close": "Zavrieť",
@@ -315,6 +325,7 @@
"common.kill": "Ukončiť",
"common.loadingData": "Načítavanie dát",
"common.name": "Názov",
"common.newConnection": "Nové pripojenie",
"common.notSelectedOptional": "(nezvolené - voliteľné)",
"common.parameters": "Parametre",
"common.passwordEncrypted": "Heslo je zašifrované",
@@ -324,6 +335,7 @@
"common.queryEditor": "Editor SQL dotazov",
"common.refresh": "Obnoviť",
"common.remove": "Odstrániť",
"common.removeAll": "Odstrániť všetko",
"common.reset": "Resetovať",
"common.save": "Uložiť",
"common.saveAndNext": "Uložiť a pokračovať",
@@ -331,6 +343,7 @@
"common.schema": "Schéma",
"common.search": "Hledat",
"common.searchBy": "Hľadať podľa:",
"common.server": "Server",
"common.sqlGenerator": "SQL Generátor",
"common.table": "Tabuľka",
"common.testingConnection": "Testovanie pripojenia",
@@ -574,6 +587,12 @@
"dbObject.triggers": "Triggery",
"dbObject.truncateTable": "Orezanie tabuľky",
"dbObject.views": "Pohľady",
"designerTable.addReferences": "Pridať referencie",
"designerTable.changeColor": "Zmeniť farbu",
"designerTable.defineVirtualForeignKey": "Definovať virtuálny cudzí kľúč",
"designerTable.newAlias": "Nový alias",
"designerTable.removeTableAlias": "Odstrániť alias tabuľky",
"designerTable.setTableAlias": "Nastaviť alias tabuľky",
"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",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "Súbory návrhu dotazu",
"file.sqlFiles": "SQL súbory",
"file.sqliteDatabase": "SQLite databáza",
"files.allSupportedFiles": "Všetky podporované súbory",
"files.favorites": "Obľúbené",
"files.openFile": "Otvoriť súbor",
"files.refreshFiles": "Obnoviť súbory",
"files.savedFiles": "Uložené súbory",
"files.searchSavedFiles": "Hľadať v uložených súboroch",
"files.sqlFiles": "SQL súbory",
"files.teamFiles": "Tímové súbory",
"files.uploadFile": "Nahrať súbor",
"filter.after": "Po...",
"filter.and": "A",
"filter.arrayIsEmpty": "Pole je prázdne",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "Referencovaný stĺpec - ",
"foreignKeyEditor.referencedTable": "Referencovaná tabuľka - ",
"foreignKeyEditor.tableNotSet": "(tabuľka nie je nastavená)",
"history.queryHistory": "História dotazov",
"history.recentlyClosedTabs": "Nedávno zatvorené karty",
"history.searchQueryHistory": "Hľadať v histórii dotazov",
"importExport.action": "Akcia",
"importExport.addWebUrl": "Pridať web URL",
"importExport.advancedConfiguration": "Pokročilá konfigurácia",
"importExport.archiveFolder": "Archívny priečinok",
"importExport.columns": "Stĺpce",
"importExport.createZipFileInArchive": "Vytvoriť ZIP súbor v archíve",
"importExport.currentArchive": "Aktuálny archív",
"importExport.currentDatabase": "Aktuálna DB",
"importExport.dragDropImportedFilesHere": "Pretiahnite importované súbory sem",
"importExport.exportToZipArchive": "Exportovať do ZIP archívu",
"importExport.exportToZipFile": "Exportovať do ZIP súboru",
"importExport.generateScript": "Generovať skript",
"importExport.importFromZipArchive": "Importovať zo ZIP archívu",
"importExport.importFromZipFile": "Importovať zo ZIP súboru (v archívnej zložke)",
"importExport.mapSourceTablesFiles": "Mapovať zdrojové tabuľky/súbory",
"importExport.messages": "Správy",
"importExport.newArchive": "Nový archív",
"importExport.outputFiles": "Výstupné súbory",
"importExport.preview": "Náhľad",
"importExport.processingImportExport": "Spracovanie importu/exportu ...",
"importExport.run": "Spustiť",
"importExport.schedule": "Plánovanie",
"importExport.source": "Zdroj",
"importExport.sourceConfiguration": "Konfigurácia zdroja",
"importExport.sourceFiles": "Zdrojové súbory",
"importExport.startVariableIndex": "Počiatočný index premennej",
"importExport.status": "Stav",
"importExport.stop": "Zastaviť",
"importExport.storageType": "Typ úložiska",
"importExport.tablesViewsCollections": "Tabuľky / pohľady / kolekcie",
"importExport.target": "Cieľ",
"importExport.targetConfiguration": "Konfigurácia cieľa",
"indexEditor.filteredIndexCondition": "Podmienka filtrovaného indexu",
"indexEditor.indexName": "Názov indexu",
"indexEditor.isUnique": "Je jedinečný index",
"logs.autoScroll": "Automatické rolovanie",
"logs.caller": "Volajúci:",
"logs.callerTab": "Volajúci",
"logs.chooseDate": "Vybrať dátum",
"logs.codeTab": "Kód",
"logs.connectionId": "ID pripojenia:",
"logs.connectionTab": "Pripojenie",
"logs.database": "Databáza:",
"logs.databaseTab": "Databáza",
"logs.date": "Dátum:",
"logs.dateTab": "Dátum",
"logs.details": "Detaily",
"logs.engine": "Engine:",
"logs.engineTab": "Engine",
"logs.loadingNextRows": "Načítavanie ďalších riadkov...",
"logs.message": "Správa:",
"logs.messageCode": "Kód správy:",
"logs.messageTab": "Správa",
"logs.name": "Názov:",
"logs.nameTab": "Názov",
"logs.noDataForSelectedDate": "Pre zvolený dátum nie sú k dispozícii žiadne dáta",
"logs.recentLogs": "Nedávne logy",
"logs.refresh": "Obnoviť",
"logs.time": "Čas:",
"logs.timeTab": "Čas",
"menu.edit": "Upraviť",
"menu.file": "Súbor",
"menu.help": "Pomoc",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "SQL Generátor nie je k dispozícii pre aktuálnu databázu",
"newObject.tableDescription": "Vytvoriť tabuľku v aktuálnej databáze",
"newObject.tableDisabled": "Vytvorenie tabuľky nie je k dispozícii pre aktuálnu databázu",
"plugins.searchExtensionsOnWeb": "Hľadať rozšírenia na webe",
"publicCloudWidget.onlyRelevantFilesListed": "Sú zobrazené iba súbory relevantné pre vaše pripojenia, platformu a edíciu DbGate. Najprv definujte pripojenia.",
"publicCloudWidget.refreshFiles": "Obnoviť súbory",
"publicCloudWidget.refreshList": "Obnoviť zoznam",
"publicCloudWidget.searchPublicFiles": "Hľadať verejné súbory",
"query.limitRows": "Obmedziť na {queryRowsLimit} riadkov",
"query.named": ":premenná",
"query.noParameters": "(žiadne parametre)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "Názov stĺpca",
"sqlObject.databaseEmpty": "Databáza {database} je prázdna alebo štruktúra nie je načítaná, stlačte tlačidlo Obnoviť pre opätovné načítanie štruktúry",
"sqlObject.loadingStructure": "Načítavanie štruktúry databázy",
"sqlObject.name": "Názov",
"sqlObject.newCollection": "Nová kolekcia/kontajner",
"sqlObject.rowCount": "Počet riadkov",
"sqlObject.schemaName": "Schéma",
"sqlObject.search.placeholder": "Hľadať v tabuľkách, pohľadoch, procedúrach",
"sqlObject.searchBy": "Hľadať podľa:",
"sqlObject.sizeBytes": "Veľkosť (bajty)",
"sqlObject.sortBy": "Zoradiť podľa:",
"sqlObject.tableComment": "Komentár tabuľky",
"sqlObject.tableEngine": "Engine tabuľky",
"sqlObject.tableViewProcedureName": "Názov tabuľky/pohľadu/procedúry",
@@ -902,6 +992,17 @@
"widget.keys": "Kľúče",
"widget.pinned": "Pripnuté",
"widget.tablesViewsFunctions": "Tabuľky, pohľady, funkcie",
"widgets.addNew": "Pridať nový",
"widgets.administration": "Administrácia",
"widgets.archive": "Archív (uložené tabuľkové dáta)",
"widgets.availableExtensions": "Dostupné rozšírenia",
"widgets.databaseConnections": "Databázové pripojenia",
"widgets.dbgateCloud": "DbGate Cloud",
"widgets.favoritesAndSavedFiles": "Obľúbené a uložené súbory",
"widgets.installedExtensions": "Nainštalované rozšírenia",
"widgets.managePlugins": "Spravovať pluginy",
"widgets.premiumPromo": "Premium promo",
"widgets.queryHistoryAndClosedTabs": "História dotazov a zatvorené karty",
"widgets.selectedCellDataDetailView": "Detailné zobrazenie dát vybranej bunky",
"widgets.viewApplicationLogs": "Zobraziť aplikačné logy"
}
}
+102 -1
View File
@@ -3,6 +3,11 @@
"app.loading_plugin": "正在加载插件 {plugin} ...",
"app.preparingPlugins": "正在准备插件 ...",
"app.starting": "正在启动 DbGate",
"cellDataWidget.autodetect": "自动检测 - {autoDetectTitle}",
"cellDataWidget.formatNotSelected": "未选择格式",
"cellDataWidget.mustSelectOneCell": "必须选择一个单元格",
"cellDataWidget.noDataSelected": "未选择数据",
"cellDataWidget.title": "单元格数据视图",
"chart.detect": "检测图表",
"chart.open": "打开图表",
"clipboard.SQLInsert": "SQL INSERT 语句",
@@ -40,6 +45,10 @@
"columnEditor.isSparse": "稀疏",
"columnEditor.isUnsigned": "无符号",
"columnEditor.isZerofill": "零填充",
"columnLine.addReference": "添加引用",
"columnLine.sortAscending": "升序排序",
"columnLine.sortDescending": "降序排序",
"columnLine.unsort": "取消排序",
"columnsConstraintEditor.addNewColumn": "添加新列",
"columnsConstraintEditor.chooseColumn": "选择列",
"columnsConstraintEditor.selectColumn": "选择列",
@@ -289,6 +298,7 @@
"commandModal.showKeyCombination": "显示所需的键盘组合并按回车键",
"common.addNew": "添加新项",
"common.advanced": "高级",
"common.allFields": "所有 {field}",
"common.archive": "归档 (JSONL)",
"common.cancel": "取消",
"common.close": "关闭",
@@ -315,6 +325,7 @@
"common.kill": "终止",
"common.loadingData": "正在加载数据",
"common.name": "名称",
"common.newConnection": "新建连接",
"common.notSelectedOptional": "(未选择 - 可选)",
"common.parameters": "参数",
"common.passwordEncrypted": "密码已加密",
@@ -324,6 +335,7 @@
"common.queryEditor": "SQL 查询编辑器",
"common.refresh": "刷新",
"common.remove": "移除",
"common.removeAll": "全部移除",
"common.reset": "重置",
"common.save": "保存",
"common.saveAndNext": "保存并下一个",
@@ -331,6 +343,7 @@
"common.schema": "模式",
"common.search": "搜索",
"common.searchBy": "搜索方式:",
"common.server": "服务器",
"common.sqlGenerator": "SQL 生成器",
"common.table": "表",
"common.testingConnection": "正在测试连接",
@@ -574,6 +587,12 @@
"dbObject.triggers": "触发器",
"dbObject.truncateTable": "截断表",
"dbObject.views": "视图",
"designerTable.addReferences": "添加引用",
"designerTable.changeColor": "更改颜色",
"designerTable.defineVirtualForeignKey": "定义虚拟外键",
"designerTable.newAlias": "新建别名",
"designerTable.removeTableAlias": "移除表别名",
"designerTable.setTableAlias": "设置表别名",
"error.driverNotFound": "无效的数据库连接,未找到驱动程序",
"error.selectedCloudConnection": "选定的连接来自DbGate云",
"error.selectedNotCloudConnection": "选定的连接不来自DbGate云",
@@ -588,6 +607,15 @@
"file.queryDesignerFiles": "查询设计器文件",
"file.sqlFiles": "SQL文件",
"file.sqliteDatabase": "SQLite数据库",
"files.allSupportedFiles": "所有支持的文件",
"files.favorites": "收藏",
"files.openFile": "打开文件",
"files.refreshFiles": "刷新文件",
"files.savedFiles": "已保存文件",
"files.searchSavedFiles": "搜索已保存文件",
"files.sqlFiles": "SQL 文件",
"files.teamFiles": "团队文件",
"files.uploadFile": "上传文件",
"filter.after": "之后...",
"filter.and": "且",
"filter.arrayIsEmpty": "数组为空",
@@ -669,16 +697,69 @@
"foreignKeyEditor.refColumn": "引用列 - ",
"foreignKeyEditor.referencedTable": "引用表",
"foreignKeyEditor.tableNotSet": "(未设置表)",
"history.queryHistory": "查询历史",
"history.recentlyClosedTabs": "最近关闭的标签页",
"history.searchQueryHistory": "搜索查询历史",
"importExport.action": "操作",
"importExport.addWebUrl": "添加 Web URL",
"importExport.advancedConfiguration": "高级配置",
"importExport.archiveFolder": "归档文件夹",
"importExport.columns": "列",
"importExport.createZipFileInArchive": "在存档中创建ZIP文件",
"importExport.currentArchive": "当前归档",
"importExport.currentDatabase": "当前数据库",
"importExport.dragDropImportedFilesHere": "将导入的文件拖放到此处",
"importExport.exportToZipArchive": "输出ZIP存档",
"importExport.exportToZipFile": "导出到ZIP文件",
"importExport.generateScript": "生成脚本",
"importExport.importFromZipArchive": "输入ZIP存档",
"importExport.importFromZipFile": "从ZIP文件导入(在存档文件夹中)",
"importExport.mapSourceTablesFiles": "映射源表/文件",
"importExport.messages": "消息",
"importExport.newArchive": "新建归档",
"importExport.outputFiles": "输出文件",
"importExport.preview": "预览",
"importExport.processingImportExport": "正在处理导入/导出 ...",
"importExport.run": "运行",
"importExport.schedule": "计划",
"importExport.source": "源",
"importExport.sourceConfiguration": "源配置",
"importExport.sourceFiles": "源文件",
"importExport.startVariableIndex": "起始变量索引",
"importExport.status": "状态",
"importExport.stop": "停止",
"importExport.storageType": "存储类型",
"importExport.tablesViewsCollections": "表 / 视图 / 集合",
"importExport.target": "目标",
"importExport.targetConfiguration": "目标配置",
"indexEditor.filteredIndexCondition": "过滤索引条件",
"indexEditor.indexName": "索引名称",
"indexEditor.isUnique": "是唯一索引",
"logs.autoScroll": "自动滚动",
"logs.caller": "调用方:",
"logs.callerTab": "调用方",
"logs.chooseDate": "选择日期",
"logs.codeTab": "代码",
"logs.connectionId": "连接 ID",
"logs.connectionTab": "连接",
"logs.database": "数据库:",
"logs.databaseTab": "数据库",
"logs.date": "日期:",
"logs.dateTab": "日期",
"logs.details": "详情",
"logs.engine": "引擎:",
"logs.engineTab": "引擎",
"logs.loadingNextRows": "正在加载下一批行...",
"logs.message": "消息:",
"logs.messageCode": "消息代码:",
"logs.messageTab": "消息",
"logs.name": "名称:",
"logs.nameTab": "名称",
"logs.noDataForSelectedDate": "所选日期无数据",
"logs.recentLogs": "最近日志",
"logs.refresh": "刷新",
"logs.time": "时间:",
"logs.timeTab": "时间",
"menu.edit": "编辑",
"menu.file": "文件",
"menu.help": "帮助",
@@ -703,6 +784,11 @@
"newObject.sqlGeneratorDisabled": "当前数据库不支持SQL生成器",
"newObject.tableDescription": "在当前数据库中创建表",
"newObject.tableDisabled": "当前数据库不支持创建表",
"plugins.searchExtensionsOnWeb": "在网页上搜索扩展",
"publicCloudWidget.onlyRelevantFilesListed": "仅列出与您的连接、平台和 DbGate 版本相关的文件。请先定义连接。",
"publicCloudWidget.refreshFiles": "刷新文件",
"publicCloudWidget.refreshList": "刷新列表",
"publicCloudWidget.searchPublicFiles": "搜索公共文件",
"query.limitRows": "限制 {queryRowsLimit} 行",
"query.named": ":variable",
"query.noParameters": "(无参数)",
@@ -819,10 +905,14 @@
"sqlObject.columnName": "列名称",
"sqlObject.databaseEmpty": "数据库 {database} 为空或结构未加载,请按刷新按钮重新加载结构",
"sqlObject.loadingStructure": "加载数据库结构",
"sqlObject.name": "名称",
"sqlObject.newCollection": "新集合/容器",
"sqlObject.rowCount": "行数",
"sqlObject.schemaName": "模式",
"sqlObject.search.placeholder": "在表、视图、存储过程中搜索",
"sqlObject.searchBy": "搜索条件:",
"sqlObject.sizeBytes": "大小(字节)",
"sqlObject.sortBy": "排序方式:",
"sqlObject.tableComment": "表注释",
"sqlObject.tableEngine": "表引擎",
"sqlObject.tableViewProcedureName": "表/视图/存储过程名称",
@@ -902,6 +992,17 @@
"widget.keys": "键",
"widget.pinned": "已固定",
"widget.tablesViewsFunctions": "表、视图、函数",
"widgets.addNew": "添加新项",
"widgets.administration": "管理",
"widgets.archive": "归档(已保存的表格数据)",
"widgets.availableExtensions": "可用扩展",
"widgets.databaseConnections": "数据库连接",
"widgets.dbgateCloud": "DbGate 云",
"widgets.favoritesAndSavedFiles": "收藏和已保存文件",
"widgets.installedExtensions": "已安装扩展",
"widgets.managePlugins": "管理插件",
"widgets.premiumPromo": "高级版推广",
"widgets.queryHistoryAndClosedTabs": "查询历史和已关闭标签页",
"widgets.selectedCellDataDetailView": "选定单元格数据详细视图",
"widgets.viewApplicationLogs": "查看应用程序日志"
}
}
+1 -1
View File
@@ -7,7 +7,7 @@ checkout-and-merge-pro:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: f27a03d4aff5b00a009643df146a9c17bdbf7801
ref: 626a30d67f40e910e8c3ed89ec34d5aa58c1f7e2
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+22 -1
View File
@@ -2669,6 +2669,13 @@
dependencies:
sparse-bitfield "^3.0.3"
"@mongodb-js/saslprep@^1.3.0":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz#51e5cad2f24b8759702d9cc185da0a3ef3784bad"
integrity sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg==
dependencies:
sparse-bitfield "^3.0.3"
"@mongodb-js/socksv5@^0.0.10":
version "0.0.10"
resolved "https://registry.yarnpkg.com/@mongodb-js/socksv5/-/socksv5-0.0.10.tgz#d734c9799a5d011caaf43788e16925aca90712d8"
@@ -6159,6 +6166,11 @@ dbgate-query-splitter@^4.11.7:
resolved "https://registry.yarnpkg.com/dbgate-query-splitter/-/dbgate-query-splitter-4.11.7.tgz#f9d53b3ceafbd76355152677b87ae453598b4a88"
integrity sha512-2J0Gc2hyZrHnrLBpI6Tw8MvP7V01eTj+SMHLeG9ggVf6Y8JB/6JBK5kPwhz77SwZw/InhpaweCUBoHFCJUv/kg==
dbgate-query-splitter@^4.11.9:
version "4.11.9"
resolved "https://registry.yarnpkg.com/dbgate-query-splitter/-/dbgate-query-splitter-4.11.9.tgz#1461ec652caf6b44d7b94109610f497695c4aef6"
integrity sha512-WaN9VFgmIpIvpNDUFNV1P0m7TimCAk2Itgk4lKndxC+ixhersHfLfGcea5gcKS1ie8+SRoKlFsfe/MIehvOA9A==
debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -10685,7 +10697,7 @@ mongodb-connection-string-url@^3.0.0:
"@types/whatwg-url" "^11.0.2"
whatwg-url "^13.0.0"
mongodb-connection-string-url@^3.0.1:
mongodb-connection-string-url@^3.0.1, mongodb-connection-string-url@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7"
integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==
@@ -10698,6 +10710,15 @@ mongodb-ns@^2.4.0:
resolved "https://registry.yarnpkg.com/mongodb-ns/-/mongodb-ns-2.4.2.tgz#481592316d3a2be68accbba3aca2cb660eb6da1d"
integrity sha512-gYJjEYG4v4a1WSXgUf81OBoBRlj+Z1SlnQVO392fC/4a1CN7CLWDITajZWPFTPh/yRozYk6sHHtZwZmQhodBEA==
"mongodb-old@npm:mongodb@^6.16.0":
version "6.21.0"
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.21.0.tgz#f83355905900f2e7a912593f0315d5e2e0bda576"
integrity sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A==
dependencies:
"@mongodb-js/saslprep" "^1.3.0"
bson "^6.10.4"
mongodb-connection-string-url "^3.0.2"
mongodb-redact@^1.1.5:
version "1.1.8"
resolved "https://registry.yarnpkg.com/mongodb-redact/-/mongodb-redact-1.1.8.tgz#47323bd7fcdb033d75ccf539e4fa3685fa5221c5"