diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 9cdbdf1f6..caa117f7a 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -43,7 +43,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index 72fa001f0..d568df362 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -43,7 +43,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-cloud-pro.yaml b/.github/workflows/build-cloud-pro.yaml index e69e17de9..65323d8d4 100644 --- a/.github/workflows/build-cloud-pro.yaml +++ b/.github/workflows/build-cloud-pro.yaml @@ -39,7 +39,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-docker-pro.yaml b/.github/workflows/build-docker-pro.yaml index 1dd394cf6..b17dfa8ce 100644 --- a/.github/workflows/build-docker-pro.yaml +++ b/.github/workflows/build-docker-pro.yaml @@ -44,7 +44,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-npm-pro.yaml b/.github/workflows/build-npm-pro.yaml index dfa2cdb31..68b9e5285 100644 --- a/.github/workflows/build-npm-pro.yaml +++ b/.github/workflows/build-npm-pro.yaml @@ -35,7 +35,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/e2e-pro.yaml b/.github/workflows/e2e-pro.yaml index f2566871d..603700d7c 100644 --- a/.github/workflows/e2e-pro.yaml +++ b/.github/workflows/e2e-pro.yaml @@ -26,7 +26,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/run-tests.yaml b/.github/workflows/run-tests.yaml index f298d6385..e0528c4a6 100644 --- a/.github/workflows/run-tests.yaml +++ b/.github/workflows/run-tests.yaml @@ -42,24 +42,6 @@ jobs: run: | cd packages/tools yarn test:ci - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: integration-tests/result.json - action-name: Integration tests - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: packages/filterparser/result.json - action-name: Filter parser test results - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: packages/datalib/result.json - action-name: Datalib (perspectives) test results services: postgres-integr: image: postgres diff --git a/.gitignore b/.gitignore index a979e82c8..7f3e7b4c4 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ docker/plugins .env.development.local .env.test.local .env.production.local +.env.translation npm-debug.log* yarn-debug.log* diff --git a/CHANGELOG.md b/CHANGELOG.md index 59bddc515..245183317 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,19 @@ Builds: - linux - application for linux - win - application for Windows +## 6.7.1 +- 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 +- FIXED: Fixed problems in saving team files in Team Premium edition +- CHANGED: Files are by default saved to team folders in Team Premium edition +- ADDED: Other files types supported in Team Premium edition (diagrams, query design, perspectives, import/export jobs, shell scripts, database compare jobs) + ## 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 diff --git a/app/src/mainMenuDefinition.js b/app/src/mainMenuDefinition.js index 71d236e72..bb3696c94 100644 --- a/app/src/mainMenuDefinition.js +++ b/app/src/mainMenuDefinition.js @@ -76,6 +76,8 @@ module.exports = ({ editMenu, isMac }, currentTranslations = null) => [ { command: 'app.zoomIn', hideDisabled: true }, { command: 'app.zoomOut', hideDisabled: true }, { command: 'app.zoomReset', hideDisabled: true }, + { divider: true }, + { command: 'app.showLogs', hideDisabled: true }, ], }, { @@ -95,6 +97,8 @@ module.exports = ({ editMenu, isMac }, currentTranslations = null) => [ { divider: true }, { command: 'app.exportConnections', hideDisabled: true }, { command: 'app.importConnections', hideDisabled: true }, + { divider: true }, + { command: 'app.managePlugins', hideDisabled: true }, ], }, ...(isMac diff --git a/common/translations-cli/translate.js b/common/translations-cli/translate.js new file mode 100644 index 000000000..fd6613102 --- /dev/null +++ b/common/translations-cli/translate.js @@ -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'); +})(); diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index c617d7241..5a2fbcf38 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -60,7 +60,7 @@ describe('Data browser data', () => { cy.contains('MyChinook').click(); cy.testid('SqlObjectList_search').clear().type('album'); cy.contains('Tables (1/11)'); - cy.contains('347 rows, InnoDB'); + cy.contains('347 rows, 65.5 KB, InnoDB'); cy.testid('SqlObjectList_searchMenuDropDown').click(); cy.contains('Column name').click(); cy.contains('Tables (2/11)'); diff --git a/integration-tests/__tests__/alter-table.spec.js b/integration-tests/__tests__/alter-table.spec.js index 65e1b2d3f..62e3df85f 100644 --- a/integration-tests/__tests__/alter-table.spec.js +++ b/integration-tests/__tests__/alter-table.spec.js @@ -12,6 +12,7 @@ const { } = require('dbgate-tools'); function pickImportantTableInfo(engine, table) { + if (!table) return table; const props = ['columnName', 'defaultValue']; if (!engine.skipNullability) props.push('notNull'); if (!engine.skipAutoIncrement) props.push('autoIncrement'); @@ -25,6 +26,13 @@ function pickImportantTableInfo(engine, table) { .map(props => _.omitBy(props, (v, k) => k == 'defaultValue' && v == 'NULL' && engine.setNullDefaultInsteadOfDrop) ), + // foreignKeys: table.foreignKeys + // .sort((a, b) => a.refTableName.localeCompare(b.refTableName)) + // .map(fk => ({ + // constraintType: fk.constraintType, + // refTableName: fk.refTableName, + // columns: fk.columns.map(col => ({ columnName: col.columnName, refColumnName: col.refColumnName })), + // })), }; } @@ -33,7 +41,7 @@ function checkTableStructure(engine, t1, t2) { expect(pickImportantTableInfo(engine, t1)).toEqual(pickImportantTableInfo(engine, t2)); } -async function testTableDiff(engine, conn, driver, mangle) { +async function testTableDiff(engine, conn, driver, mangle, changedTable = 't1') { const initQuery = formatQueryWithoutParams(driver, `create table ~t0 (~id int not null primary key)`); await driver.query(conn, transformSqlForEngine(engine, initQuery)); @@ -68,17 +76,38 @@ async function testTableDiff(engine, conn, driver, mangle) { await driver.query(conn, transformSqlForEngine(engine, query)); } - const tget = x => x.tables.find(y => y.pureName == 't1'); - const structure1 = generateDbPairingId(extendDatabaseInfo(await driver.analyseFull(conn))); + if (!engine.skipReferences) { + const query = formatQueryWithoutParams( + driver, + `create table ~t3 (~id int not null primary key, ~fkval int ${ + driver.dialect.implicitNullDeclaration ? '' : 'null' + })` + ); + + await driver.query(conn, transformSqlForEngine(engine, query)); + } + + const tget = x => x?.tables?.find(y => y.pureName == changedTable); + const structure1Source = await driver.analyseFull(conn); + const structure1 = generateDbPairingId(extendDatabaseInfo(structure1Source)); let structure2 = _.cloneDeep(structure1); mangle(tget(structure2)); structure2 = extendDatabaseInfo(structure2); const { sql } = getAlterTableScript(tget(structure1), tget(structure2), {}, structure1, structure2, driver); + + // sleep 1s - some engines have update datetime precision only to seconds + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('RUNNING ALTER SQL', driver.engine, ':', sql); await driver.script(conn, sql); + // if (!engine.skipIncrementalAnalysis) { + // const structure2RealIncremental = await driver.analyseIncremental(conn, structure1Source); + // checkTableStructure(engine, tget(structure2RealIncremental), tget(structure2)); + // } + const structure2Real = extendDatabaseInfo(await driver.analyseFull(conn)); checkTableStructure(engine, tget(structure2Real), tget(structure2)); @@ -214,6 +243,48 @@ describe('Alter table', () => { }) ); + test.each(engines.filter(x => !x.skipReferences).map(engine => [engine.label, engine]))( + 'Drop FK - %s', + testWrapper(async (conn, driver, engine) => { + await testTableDiff( + engine, + conn, + driver, + tbl => { + tbl.foreignKeys = []; + }, + 't2' + ); + }) + ); + + test.each(engines.filter(x => !x.skipReferences).map(engine => [engine.label, engine]))( + 'Create FK - %s', + testWrapper(async (conn, driver, engine) => { + await testTableDiff( + engine, + conn, + driver, + tbl => { + tbl.foreignKeys = [ + { + constraintType: 'foreignKey', + pureName: 't3', + refTableName: 't1', + columns: [ + { + columnName: 'fkval', + refColumnName: 'col_ref', + }, + ], + }, + ]; + }, + 't3' + ); + }) + ); + // test.each(engines.map(engine => [engine.label, engine]))( // 'Change autoincrement - %s', // testWrapper(async (conn, driver, engine) => { diff --git a/integration-tests/__tests__/schema-tests.spec.js b/integration-tests/__tests__/schema-tests.spec.js index fda045c90..bf3f47f4a 100644 --- a/integration-tests/__tests__/schema-tests.spec.js +++ b/integration-tests/__tests__/schema-tests.spec.js @@ -28,12 +28,14 @@ describe('Schema tests', () => { const count = schemas1.length; expect(structure1.tables.length).toEqual(2); await runCommandOnDriver(conn, driver, dmp => dmp.createSchema('myschema')); - const structure2 = await driver.analyseIncremental(conn, structure1); - const schemas2 = await driver.listSchemas(conn); - expect(schemas2.find(x => x.schemaName == 'myschema')).toBeTruthy(); - expect(schemas2.length).toEqual(count + 1); - expect(schemas2.find(x => x.isDefault).schemaName).toEqual(engine.defaultSchemaName); - expect(structure2).toBeNull(); + if (!engine.skipIncrementalAnalysis) { + const structure2 = await driver.analyseIncremental(conn, structure1); + const schemas2 = await driver.listSchemas(conn); + expect(schemas2.find(x => x.schemaName == 'myschema')).toBeTruthy(); + expect(schemas2.length).toEqual(count + 1); + expect(schemas2.find(x => x.isDefault).schemaName).toEqual(engine.defaultSchemaName); + expect(structure2).toBeNull(); + } }) ); @@ -48,10 +50,12 @@ describe('Schema tests', () => { expect(schemas1.find(x => x.schemaName == 'myschema')).toBeTruthy(); expect(structure1.tables.length).toEqual(2); await runCommandOnDriver(conn, driver, dmp => dmp.dropSchema('myschema')); - const structure2 = await driver.analyseIncremental(conn, structure1); - const schemas2 = await driver.listSchemas(conn); - expect(schemas2.find(x => x.schemaName == 'myschema')).toBeFalsy(); - expect(structure2).toBeNull(); + if (!engine.skipIncrementalAnalysis) { + const structure2 = await driver.analyseIncremental(conn, structure1); + const schemas2 = await driver.listSchemas(conn); + expect(schemas2.find(x => x.schemaName == 'myschema')).toBeFalsy(); + expect(structure2).toBeNull(); + } }) ); diff --git a/integration-tests/engines.js b/integration-tests/engines.js index 99b1308ea..528925e2c 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -187,6 +187,7 @@ const mariaDbEngine = { /** @type {import('dbgate-types').TestEngineInfo} */ const postgreSqlEngine = { label: 'PostgreSQL', + skipIncrementalAnalysis: true, connection: { engine: 'postgres@dbgate-plugin-postgres', password: 'Pwd2020Db', @@ -757,11 +758,11 @@ const enginesOnCi = [ const enginesOnLocal = [ // all engines, which would be run on local test // cassandraEngine, - //mysqlEngine, + // mysqlEngine, // mariaDbEngine, - //postgreSqlEngine, + postgreSqlEngine, //sqlServerEngine, - sqliteEngine, + // sqliteEngine, // cockroachDbEngine, // clickhouseEngine, // libsqlFileEngine, diff --git a/integration-tests/jest.config.js b/integration-tests/jest.config.js index 83368208f..c3c764a9b 100644 --- a/integration-tests/jest.config.js +++ b/integration-tests/jest.config.js @@ -1,3 +1,4 @@ module.exports = { setupFilesAfterEnv: ['/setupTests.js'], + reporters: ['default', 'github-actions'], }; diff --git a/integration-tests/package.json b/integration-tests/package.json index a8c3e670b..8bf77ab50 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "cross-env": "^7.0.3", - "jest": "^27.0.1", + "jest": "^28.1.3", "pino-pretty": "^11.2.2", "tmp": "^0.2.3" } diff --git a/package.json b/package.json index 9735dc30a..79b06aeb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.7.1-premium-beta.3", + "version": "6.7.2-premium-beta.2", "name": "dbgate-all", "workspaces": [ "packages/*", diff --git a/packages/api/src/controllers/config.js b/packages/api/src/controllers/config.js index 7f9b2547c..f47c5245a 100644 --- a/packages/api/src/controllers/config.js +++ b/packages/api/src/controllers/config.js @@ -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; diff --git a/packages/api/src/storageModel.js b/packages/api/src/storageModel.js index 0202f1641..dfeb773eb 100644 --- a/packages/api/src/storageModel.js +++ b/packages/api/src/storageModel.js @@ -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,38 @@ module.exports = { "preloadedRows": [ { "id": -1, - "name": "sql" + "name": "sql", + "format": "text" + }, + { + "id": -2, + "name": "diagrams", + "format": "json" + }, + { + "id": -3, + "name": "query", + "format": "json" + }, + { + "id": -4, + "name": "perspectives", + "format": "json" + }, + { + "id": -5, + "name": "impexp", + "format": "json" + }, + { + "id": -6, + "name": "shell", + "format": "text" + }, + { + "id": -7, + "name": "dbcompare", + "format": "json" } ] }, diff --git a/packages/datalib/jest.config.js b/packages/datalib/jest.config.js index 790050941..38f6eab3c 100644 --- a/packages/datalib/jest.config.js +++ b/packages/datalib/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', moduleFileExtensions: ['js'], + reporters: ['default', 'github-actions'], }; diff --git a/packages/dbmodel/bin/dbmodel.js b/packages/dbmodel/bin/dbmodel.js index 596be53db..54ea49339 100755 --- a/packages/dbmodel/bin/dbmodel.js +++ b/packages/dbmodel/bin/dbmodel.js @@ -35,6 +35,12 @@ program .option('-u, --user ', 'user name') .option('-p, --password ', 'password') .option('-d, --database ', 'database name') + .option('--url ', 'database url') + .option('--file ', 'database file') + .option('--socket-path ', 'socket path') + .option('--service-name ', 'service name (for Oracle)') + .option('--auth-type ', 'authentication type') + .option('--use-ssl', 'use SSL connection') .option('--auto-index-foreign-keys', 'automatically adds indexes to all foreign keys') .option( '--load-data-condition ', @@ -48,7 +54,7 @@ program .command('deploy ') .description('Deploys model to database') .action(modelFolder => { - const { engine, server, user, password, database, transaction } = program.opts(); + const { engine, server, user, password, database, url, file, transaction } = program.opts(); // const hooks = []; // if (program.autoIndexForeignKeys) hooks.push(dbmodel.hooks.autoIndexForeignKeys); @@ -60,6 +66,13 @@ program user, password, database, + databaseUrl: url, + useDatabaseUrl: !!url, + databaseFile: file, + socketPath: program.socketPath, + serviceName: program.serviceName, + authType: program.authType, + useSsl: program.useSsl, }, modelFolder, useTransaction: transaction, diff --git a/packages/filterparser/jest.config.js b/packages/filterparser/jest.config.js index 790050941..38f6eab3c 100644 --- a/packages/filterparser/jest.config.js +++ b/packages/filterparser/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', moduleFileExtensions: ['js'], + reporters: ['default', 'github-actions'], }; diff --git a/packages/sqltree/src/dumpSqlCommand.ts b/packages/sqltree/src/dumpSqlCommand.ts index e8286bafb..b3b9373a4 100644 --- a/packages/sqltree/src/dumpSqlCommand.ts +++ b/packages/sqltree/src/dumpSqlCommand.ts @@ -1,7 +1,7 @@ import type { SqlDumper } from 'dbgate-types'; import { Command, Select, Update, Delete, Insert } from './types'; import { dumpSqlExpression } from './dumpSqlExpression'; -import { dumpSqlFromDefinition, dumpSqlSourceRef } from './dumpSqlSource'; +import { dumpSqlFromDefinition, dumpSqlSourceDef, dumpSqlSourceRef } from './dumpSqlSource'; import { dumpSqlCondition } from './dumpSqlCondition'; export function dumpSqlSelect(dmp: SqlDumper, cmd: Select) { @@ -115,7 +115,10 @@ export function dumpSqlInsert(dmp: SqlDumper, cmd: Insert) { cmd.fields.map(x => x.targetColumn) ); dmp.putCollection(',', cmd.fields, x => dumpSqlExpression(dmp, x)); - if (dmp.dialect.requireFromDual) { + if (cmd.whereNotExistsSource) { + dmp.put(' ^from '); + dumpSqlSourceDef(dmp, cmd.whereNotExistsSource); + } else if (dmp.dialect.requireFromDual) { dmp.put(' ^from ^dual '); } dmp.put(' ^where ^not ^exists (^select * ^from %f ^where ', cmd.targetTable); diff --git a/packages/sqltree/src/dumpSqlExpression.ts b/packages/sqltree/src/dumpSqlExpression.ts index aeaf3b288..f9447f792 100644 --- a/packages/sqltree/src/dumpSqlExpression.ts +++ b/packages/sqltree/src/dumpSqlExpression.ts @@ -2,6 +2,7 @@ import _ from 'lodash'; import type { SqlDumper } from 'dbgate-types'; import { Expression, ColumnRefExpression } from './types'; import { dumpSqlSourceRef } from './dumpSqlSource'; +import { dumpSqlSelect } from './dumpSqlCommand'; export function dumpSqlExpression(dmp: SqlDumper, expr: Expression) { switch (expr.exprType) { @@ -67,5 +68,11 @@ export function dumpSqlExpression(dmp: SqlDumper, expr: Expression) { }); dmp.put(')'); break; + + case 'select': + dmp.put('('); + dumpSqlSelect(dmp, expr.select); + dmp.put(')'); + break; } } diff --git a/packages/sqltree/src/types.ts b/packages/sqltree/src/types.ts index bce0e61d3..ea7c5c994 100644 --- a/packages/sqltree/src/types.ts +++ b/packages/sqltree/src/types.ts @@ -44,6 +44,7 @@ export interface Insert { fields: UpdateField[]; targetTable: NamedObjectInfo; insertWhereNotExistsCondition?: Condition; + whereNotExistsSource?: Source; } export interface AllowIdentityInsert { @@ -226,6 +227,11 @@ export interface RowNumberExpression { orderBy: OrderByExpression[]; } +export interface SelectExpression { + exprType: 'select'; + select: Select; +} + export type Expression = | ColumnRefExpression | ValueExpression @@ -235,7 +241,8 @@ export type Expression = | CallExpression | MethodCallExpression | TranformExpression - | RowNumberExpression; + | RowNumberExpression + | SelectExpression; export type OrderByExpression = Expression & { direction: 'ASC' | 'DESC' }; export type ResultField = Expression & { alias?: string }; diff --git a/packages/tools/jest.config.js b/packages/tools/jest.config.js index 790050941..38f6eab3c 100644 --- a/packages/tools/jest.config.js +++ b/packages/tools/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', moduleFileExtensions: ['js'], + reporters: ['default', 'github-actions'], }; diff --git a/packages/types/dumper.d.ts b/packages/types/dumper.d.ts index 746cbbfc2..c5f380a22 100644 --- a/packages/types/dumper.d.ts +++ b/packages/types/dumper.d.ts @@ -16,6 +16,7 @@ export interface SqlDumper extends AlterProcessor { transform(type: TransformType, dumpExpr: () => void); createDatabase(name: string); dropDatabase(name: string); + comment(value: string); callableTemplate(func: CallableObjectInfo); diff --git a/packages/web/src/App.svelte b/packages/web/src/App.svelte index 5b08bb170..abc17dbe8 100644 --- a/packages/web/src/App.svelte +++ b/packages/web/src/App.svelte @@ -61,7 +61,7 @@ initializeAppUpdates(); installCloudListeners(); refreshPublicCloudFiles(); - saveSelectedLanguageToCache(); + saveSelectedLanguageToCache(config.preferrendLanguage); const electron = getElectron(); if (electron) { diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 871e6da1d..3ea5c6037 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -1,6 +1,7 @@ pinnedTables.update(list => [...list, data])} diff --git a/packages/web/src/buttons/InlineUploadButton.svelte b/packages/web/src/buttons/InlineUploadButton.svelte index 9c6d8bd92..7d1c6aa32 100644 --- a/packages/web/src/buttons/InlineUploadButton.svelte +++ b/packages/web/src/buttons/InlineUploadButton.svelte @@ -5,6 +5,7 @@ import getElectron from '../utility/getElectron'; import InlineButtonLabel from '../buttons/InlineButtonLabel.svelte'; import resolveApi, { resolveApiHeaders } from '../utility/resolveApi'; + import { _t } from '../translations'; import uuidv1 from 'uuid/v1'; @@ -49,11 +50,11 @@ {#if electron} - + {:else} - {}} title="Upload file" data-testid={$$props['data-testid']} htmlFor={inputId}> + {}} title={_t('files.uploadFile', { defaultMessage: "Upload file" })} data-testid={$$props['data-testid']} htmlFor={inputId}> {/if} diff --git a/packages/web/src/buttons/UploadButton.svelte b/packages/web/src/buttons/UploadButton.svelte index 0d9a18a22..33b9f6484 100644 --- a/packages/web/src/buttons/UploadButton.svelte +++ b/packages/web/src/buttons/UploadButton.svelte @@ -1,6 +1,7 @@
- Upload file + {_t('files.uploadFile', { defaultMessage: "Upload file" })}
diff --git a/packages/web/src/commands/changeDatabaseStatusCommand.ts b/packages/web/src/commands/changeDatabaseStatusCommand.ts index ff8b5f229..d5ed17452 100644 --- a/packages/web/src/commands/changeDatabaseStatusCommand.ts +++ b/packages/web/src/commands/changeDatabaseStatusCommand.ts @@ -3,7 +3,7 @@ import { currentDatabase, getCurrentDatabase } from '../stores'; import getElectron from '../utility/getElectron'; import registerCommand from './registerCommand'; import { apiCall } from '../utility/api'; -import { switchCurrentDatabase } from '../utility/common'; +import { getDatabasStatusMenu, switchCurrentDatabase } from '../utility/common'; import { __t } from '../translations'; registerCommand({ @@ -18,33 +18,7 @@ registerCommand({ conid: connection._id, database: name, }; - return [ - { - text: 'Sync model (incremental)', - onClick: () => { - apiCall('database-connections/sync-model', dbid); - }, - }, - { - text: 'Sync model (full)', - onClick: () => { - apiCall('database-connections/sync-model', { ...dbid, isFullRefresh: true }); - }, - }, - { - text: 'Reopen', - onClick: () => { - apiCall('database-connections/refresh', dbid); - }, - }, - { - text: 'Disconnect', - onClick: () => { - const electron = getElectron(); - if (electron) apiCall('database-connections/disconnect', dbid); - switchCurrentDatabase(null); - }, - }, - ]; + + return getDatabasStatusMenu(dbid); }, }); diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 073fa7683..4e69d4fbe 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -11,6 +11,7 @@ import { promoWidgetPreview, visibleToolbar, visibleWidgetSideBar, + selectedWidget, } from '../stores'; import registerCommand from './registerCommand'; import { get } from 'svelte/store'; @@ -115,13 +116,13 @@ 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, onClick: () => { openNewTab({ - title: 'New Connection', + title: _t('common.newConnection', { defaultMessage: 'New Connection' }), icon: 'img connection', tabComponent: 'ConnectionTab', }); @@ -140,7 +141,7 @@ registerCommand({ !getCurrentConfig()?.runAsPortal && !getCurrentConfig()?.storageDatabase && !!getCloudSigninTokenHolder(), onClick: () => { openNewTab({ - title: 'New Connection on Cloud', + title: _t('common.newConnectionCloud', { defaultMessage: 'New Connection on Cloud' }), icon: 'img cloud-connection', tabComponent: 'ConnectionTab', props: { @@ -561,7 +562,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 +669,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' }) + ); }, }); @@ -762,6 +768,19 @@ if (isProApp()) { } if (hasPermission('settings/change')) { + registerCommand({ + id: 'settings.settingsTab', + category: __t('command.settings', { defaultMessage: 'Settings' }), + name: __t('command.settings.settingsTab', { defaultMessage: 'Settings tab' }), + onClick: () => { + openNewTab({ + title: _t('command.settings.settingsTab', { defaultMessage: 'Settings tab' }), + icon: 'icon settings', + tabComponent: 'SettingsTab', + props: {}, + }); + }, + }); registerCommand({ id: 'settings.commands', category: __t('command.settings', { defaultMessage: 'Settings' }), @@ -777,14 +796,14 @@ if (hasPermission('settings/change')) { testEnabled: () => hasPermission('settings/change'), }); - registerCommand({ - id: 'settings.show', - category: __t('command.settings', { defaultMessage: 'Settings' }), - name: __t('command.settings.change', { defaultMessage: 'Change' }), - toolbarName: __t('command.settings', { defaultMessage: 'Settings' }), - onClick: () => showModal(SettingsModal), - testEnabled: () => hasPermission('settings/change'), - }); + // registerCommand({ + // id: 'settings.show', + // category: __t('command.settings', { defaultMessage: 'Settings' }), + // name: __t('command.settings.change', { defaultMessage: 'Change' }), + // toolbarName: __t('command.settings', { defaultMessage: 'Settings' }), + // onClick: () => showModal(SettingsModal), + // testEnabled: () => hasPermission('settings/change'), + // }); } registerCommand({ @@ -799,7 +818,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 +883,7 @@ export function registerFileCommands({ undoRedo = false, executeAdditionalCondition = null, copyPaste = false, + defaultTeamFolder = false, }) { if (save) { registerCommand({ @@ -874,7 +896,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 +904,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), }); } @@ -1202,6 +1224,35 @@ registerCommand({ }, }); +if ( hasPermission('application-log')) +{ + registerCommand({ + id: 'app.showLogs', + category: __t('command.application', { defaultMessage: 'Application' }), + name: __t('command.application.showLogs', { defaultMessage: 'View application logs' }), + onClick: () => { + openNewTab({ + title: 'Application log', + icon: 'img applog', + tabComponent: 'AppLogTab', + }); + }, + }); +} + +if (hasPermission('widgets/plugins')) +{ + registerCommand({ + id: 'app.managePlugins', + category: __t('command.application', { defaultMessage: 'Application' }), + name: __t('command.application.managePlugins', { defaultMessage: 'Manage plugins' }), + onClick: () => { + selectedWidget.set('plugins'); + visibleWidgetSideBar.set(true); + }, + }); +} + const electron = getElectron(); if (electron) { electron.addEventListener('run-command', (e, commandId) => runCommand(commandId)); diff --git a/packages/web/src/designer/DesignerTable.svelte b/packages/web/src/designer/DesignerTable.svelte index c94f12d51..c13099d48 100644 --- a/packages/web/src/designer/DesignerTable.svelte +++ b/packages/web/src/designer/DesignerTable.svelte @@ -17,6 +17,7 @@ import moveDrag from '../utility/moveDrag'; import ColumnLine from './ColumnLine.svelte'; import DomTableRef from './DomTableRef'; + import { _t } from '../translations'; export let conid; export let database; @@ -185,8 +186,8 @@ const handleSetTableAlias = () => { showModal(InputTextModal, { value: alias || '', - label: 'New alias', - header: 'Set table alias', + label: _t('designerTable.newAlias', { defaultMessage: 'New alias' }), + header: _t('designerTable.setTableAlias', { defaultMessage: 'Set table alias' }), onConfirm: newAlias => { onChangeTable({ ...table, @@ -210,13 +211,13 @@ return settings?.tableMenu({ designer, designerId, onRemoveTable }); } return [ - { text: 'Remove', onClick: () => onRemoveTable({ designerId }) }, + { text: _t('common.remove', { defaultMessage: 'Remove' }), onClick: () => onRemoveTable({ designerId }) }, { divider: true }, settings?.allowTableAlias && !isMultipleTableSelection && [ - { text: 'Set table alias', onClick: handleSetTableAlias }, + { text: _t('designerTable.setTableAlias', { defaultMessage: 'Set table alias' }), onClick: handleSetTableAlias }, alias && { - text: 'Remove table alias', + text: _t('designerTable.removeTableAlias', { defaultMessage: 'Remove table alias' }), onClick: () => onChangeTable({ ...table, @@ -225,11 +226,11 @@ }, ], settings?.allowAddAllReferences && - !isMultipleTableSelection && { text: 'Add references', onClick: () => onAddAllReferences(table) }, - settings?.allowChangeColor && { text: 'Change color', onClick: () => onChangeTableColor(table) }, + !isMultipleTableSelection && { text: _t('designerTable.addReferences', { defaultMessage: 'Add references' }), onClick: () => onAddAllReferences(table) }, + settings?.allowChangeColor && { text: _t('designerTable.changeColor', { defaultMessage: 'Change color' }), onClick: () => onChangeTableColor(table) }, settings?.allowDefineVirtualReferences && !isMultipleTableSelection && { - text: 'Define virtual foreign key', + text: _t('designerTable.defineVirtualForeignKey', { defaultMessage: 'Define virtual foreign key' }), onClick: () => handleDefineVirtualForeignKey(table), }, settings?.appendTableSystemMenu && diff --git a/packages/web/src/elements/SettingsMenuControl.svelte b/packages/web/src/elements/SettingsMenuControl.svelte new file mode 100644 index 000000000..7669682be --- /dev/null +++ b/packages/web/src/elements/SettingsMenuControl.svelte @@ -0,0 +1,165 @@ + + +
+ + + + + + +
+ {#each _.compact(items) as item, index} +
+ +
+ {/each} +
+
+
+
+ + diff --git a/packages/web/src/forms/FormArchiveFilesSelect.svelte b/packages/web/src/forms/FormArchiveFilesSelect.svelte index c2dee45bd..53c6ee70c 100644 --- a/packages/web/src/forms/FormArchiveFilesSelect.svelte +++ b/packages/web/src/forms/FormArchiveFilesSelect.svelte @@ -7,6 +7,7 @@ import { getFormContext } from './FormProviderCore.svelte'; import FormSelectField from './FormSelectField.svelte'; + import { _t } from '../translations'; export let folderName; export let name; @@ -28,10 +29,10 @@
setFieldValue(name, _.uniq([...($values[name] || []), ...($files && $files.map(x => x.name))]))} /> - setFieldValue(name, [])} /> + setFieldValue(name, [])} />
diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 72fcd7c41..743461e0e 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -353,6 +353,7 @@ 'img data-deploy': 'mdi mdi-database-settings color-icon-green', 'img arrow-start-here': 'mdi mdi-arrow-down-bold-circle color-icon-green', 'img team-file': 'mdi mdi-account-file color-icon-red', + 'img table-backup': 'mdi mdi-cube color-icon-yellow', }; diff --git a/packages/web/src/impexp/FilesInput.svelte b/packages/web/src/impexp/FilesInput.svelte index 37e4d719b..3afdd30e4 100644 --- a/packages/web/src/impexp/FilesInput.svelte +++ b/packages/web/src/impexp/FilesInput.svelte @@ -23,6 +23,7 @@ import ElectronFilesInput from './ElectronFilesInput.svelte'; import { addFilesToSourceList } from './ImportExportConfigurator.svelte'; import UploadButton from '../buttons/UploadButton.svelte'; + import { _t } from '../translations'; export let setPreviewSource = undefined; @@ -55,10 +56,10 @@ {:else} {/if} - + -
Drag & drop imported files here
+
{_t('importExport.dragDropImportedFilesHere', { defaultMessage: "Drag & drop imported files here" })}
\ No newline at end of file diff --git a/packages/web/src/settings/ConnectionSettings.svelte b/packages/web/src/settings/ConnectionSettings.svelte new file mode 100644 index 000000000..7e26bdb0c --- /dev/null +++ b/packages/web/src/settings/ConnectionSettings.svelte @@ -0,0 +1,87 @@ + + +
+ +
{_t('settings.connection', { defaultMessage: 'Connection' })}
+ + { + $lockedDatabaseMode = !$lockedDatabaseMode; + }, + }} + > + ($lockedDatabaseMode = e.target.checked)} /> + + + + + + +
{_t('settings.session', { defaultMessage: 'Query sessions' })}
+ + +
+
+ + + \ No newline at end of file diff --git a/packages/web/src/settings/DataGridSettings.svelte b/packages/web/src/settings/DataGridSettings.svelte new file mode 100644 index 000000000..6fbdf7ed6 --- /dev/null +++ b/packages/web/src/settings/DataGridSettings.svelte @@ -0,0 +1,100 @@ + + +
+
{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}
+ +{#if isProApp()} + +{/if} + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/packages/web/src/settings/DefaultActionsSettings.svelte b/packages/web/src/settings/DefaultActionsSettings.svelte new file mode 100644 index 000000000..c0c293780 --- /dev/null +++ b/packages/web/src/settings/DefaultActionsSettings.svelte @@ -0,0 +1,103 @@ + + +
+ +
{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}
+ + + + + + + + + + + + + +
+
+ + + \ No newline at end of file diff --git a/packages/web/src/settings/ExternalToolsSettings.svelte b/packages/web/src/settings/ExternalToolsSettings.svelte new file mode 100644 index 000000000..56bbfbfb3 --- /dev/null +++ b/packages/web/src/settings/ExternalToolsSettings.svelte @@ -0,0 +1,50 @@ + + +
+
{_t('settings.externalTools', { defaultMessage: 'External tools' })}
+ + + + + +
+ + \ No newline at end of file diff --git a/packages/web/src/settings/GeneralSettings.svelte b/packages/web/src/settings/GeneralSettings.svelte new file mode 100644 index 000000000..acff0fedb --- /dev/null +++ b/packages/web/src/settings/GeneralSettings.svelte @@ -0,0 +1,100 @@ + +
+
{_t('settings.general', { defaultMessage: 'General' })}
+{#if electron} +
{_t('settings.appearance', { defaultMessage: 'Appearance' })}
+ { + restartWarning = true; + }} + /> + {#if restartWarning} +
+ + {_t('settings.nativeMenuRestartWarning', { + defaultMessage: 'Native menu settings will be applied after app restart', + })} +
+ {/if} +{/if} + + +
{_t('settings.localization', { defaultMessage: 'Localization' })}
+ + + { + setSelectedLanguage(e.detail); + showModal(ConfirmModal, { + message: _t('settings.localization.reloadWarning', { + defaultMessage: 'Application will be reloaded to apply new language settings', + }), + onConfirm: () => { + setTimeout(() => { + internalRedirectTo(electron ? '/index.html' : '/'); + }, 100); + }, + }); + }} +/> + +
+ + \ No newline at end of file diff --git a/packages/web/src/settings/LicenseSettings.svelte b/packages/web/src/settings/LicenseSettings.svelte new file mode 100644 index 000000000..f9261d8b1 --- /dev/null +++ b/packages/web/src/settings/LicenseSettings.svelte @@ -0,0 +1,91 @@ + + +
{_t('settings.other.license', { defaultMessage: 'License' })}
+ { + licenseKeyCheckResult = await apiCall('config/check-license', { licenseKey: value }); +}} +/> +{#if licenseKeyCheckResult} +
+ {#if licenseKeyCheckResult.status == 'ok'} +
+ + {_t('settings.other.licenseKey.valid', { defaultMessage: 'License key is valid' })} +
+ {#if licenseKeyCheckResult.validTo} +
+ {_t('settings.other.licenseKey.validTo', { defaultMessage: 'License valid to:' })} + {licenseKeyCheckResult.validTo} +
+ {/if} + {#if licenseKeyCheckResult.expiration} +
+ {_t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' })} + {safeFormatDate(licenseKeyCheckResult.expiration)} +
+ {/if} + {:else if licenseKeyCheckResult.status == 'error'} +
+ + {licenseKeyCheckResult.errorMessage ?? + _t('settings.other.licenseKey.invalid', { defaultMessage: 'License key is invalid' })} + {#if licenseKeyCheckResult.expiration} +
+ {_t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' })} + {safeFormatDate(licenseKeyCheckResult.expiration)} +
+ {/if} +
+ {#if licenseKeyCheckResult.isExpired} +
+ { + licenseKeyCheckResult = await apiCall('config/get-new-license', { oldLicenseKey: licenseKey }); + if (licenseKeyCheckResult.licenseKey) { + apiCall('config/update-settings', { 'other.licenseKey': licenseKeyCheckResult.licenseKey }); + } + }} + /> +
+ {/if} + {/if} +
+{/if} + + \ No newline at end of file diff --git a/packages/web/src/settings/OtherSettings.svelte b/packages/web/src/settings/OtherSettings.svelte new file mode 100644 index 000000000..7ab2f36bb --- /dev/null +++ b/packages/web/src/settings/OtherSettings.svelte @@ -0,0 +1,64 @@ + + +
+
{_t('settings.other', { defaultMessage: 'Other' })}
+ + + + + +{#if isProApp()} + +{/if} +
+ + + \ No newline at end of file diff --git a/packages/web/src/settings/SQLEditorSettings.svelte b/packages/web/src/settings/SQLEditorSettings.svelte new file mode 100644 index 000000000..5829986e4 --- /dev/null +++ b/packages/web/src/settings/SQLEditorSettings.svelte @@ -0,0 +1,100 @@ + + +
+
{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}
+ +
+
+ +
+
+ + ({ label: mode.label, value: mode.value }))} + value={$currentEditorKeybindigMode} + on:change={e => ($currentEditorKeybindigMode = e.detail)} + /> + +
+
+ + ($currentEditorWrapEnabled = e.target.checked)} + /> + +
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte index ff2f1f649..cc4706c37 100644 --- a/packages/web/src/settings/SettingsModal.svelte +++ b/packages/web/src/settings/SettingsModal.svelte @@ -197,6 +197,7 @@ ORDER BY { value: 'it', label: 'Italiano' }, { value: 'pt', label: 'Português (Brasil)' }, { value: 'sk', label: 'Slovenčina' }, + { value: 'ja', label: '日本語' }, { value: 'zh', label: '中文' }, ]} defaultValue={getSelectedLanguage()} @@ -366,6 +367,13 @@ ORDER BY })} defaultValue={false} /> + + +
{_t('settings.connection', { defaultMessage: 'Connection' })}
diff --git a/packages/web/src/settings/ThemeSettings.svelte b/packages/web/src/settings/ThemeSettings.svelte new file mode 100644 index 000000000..7d13e17d0 --- /dev/null +++ b/packages/web/src/settings/ThemeSettings.svelte @@ -0,0 +1,164 @@ + + +
+
{_t('settings.appearance', { defaultMessage: 'Application theme' })}
+ + { + if ($currentTheme) { + $currentTheme = null; + } else { + $currentTheme = getSystemTheme(); + } + }, + }} + > + { + if (e.target['checked']) { + $currentTheme = null; + } else { + $currentTheme = getSystemTheme(); + } + }} + /> + + +
+ {#each $extensions.themes as theme} + + {/each} +
+ +
+ {_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })} + plugins +
+ {_t('settings.appearance.afterInstalling', { + defaultMessage: + 'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.', + })} +
+ +
{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}
+ +
+
+ + ({ label: theme, value: theme }))} + value={$currentEditorTheme} + on:change={e => ($currentEditorTheme = e.detail)} + /> + +
+ +
+ + x.value == $currentEditorFontSize) ? $currentEditorFontSize : 'custom'} + on:change={e => ($currentEditorFontSize = e.detail)} + /> + +
+ +
+ + ($currentEditorFontSize = e.target['value'])} + disabled={!!FONT_SIZES.find(x => x.value == $currentEditorFontSize) && + $currentEditorFontSize != 'custom'} + /> + +
+ +
+ +
+
+ +
+ +
+
+ + \ No newline at end of file diff --git a/packages/web/src/tableeditor/ForeignKeyEditorModal.svelte b/packages/web/src/tableeditor/ForeignKeyEditorModal.svelte index e6a6eac54..500a21751 100644 --- a/packages/web/src/tableeditor/ForeignKeyEditorModal.svelte +++ b/packages/web/src/tableeditor/ForeignKeyEditorModal.svelte @@ -60,7 +60,11 @@ - {constraintInfo ? _t('foreignKeyEditor.editForeignKey', { defaultMessage: 'Edit foreign key' }) : _t('foreignKeyEditor.addForeignKey', { defaultMessage: 'Add foreign key' })} + {constraintInfo + ? _t('foreignKeyEditor.editForeignKey', { defaultMessage: 'Edit foreign key' }) + : _t('foreignKeyEditor.addForeignKey', { defaultMessage: 'Add foreign key' })}
@@ -92,6 +96,19 @@ const name = fullNameFromString(e.detail); refTableName = name.pureName; refSchemaName = name.schemaName; + + if (!columns?.find(x => x.columnName)) { + const refTable = dbInfo?.tables?.find( + x => x.pureName == refTableName && x.schemaName == refSchemaName + ); + if (refTable?.primaryKey) { + columns = refTable.primaryKey.columns.map(col => ({ + refColumnName: col.columnName, + })); + } else { + columns = []; + } + } } }} /> @@ -135,7 +152,8 @@ {_t('foreignKeyEditor.baseColumn', { defaultMessage: 'Base column - ' })}{tableInfo.pureName}
- {_t('foreignKeyEditor.refColumn', { defaultMessage: 'Ref column - ' })}{refTableName || _t('foreignKeyEditor.tableNotSet', { defaultMessage: '(table not set)' })} + {_t('foreignKeyEditor.refColumn', { defaultMessage: 'Ref column - ' })}{refTableName || + _t('foreignKeyEditor.tableNotSet', { defaultMessage: '(table not set)' })}
@@ -217,7 +235,11 @@ }} /> - + {#if constraintInfo} ({ ...x, ordinal: index + 1 }))} - title={_t('tableEditor.columns', { defaultMessage: 'Columns ({columnCount})', values: { columnCount: columns?.length || 0 } })} + title={_t('tableEditor.columns', { + defaultMessage: 'Columns ({columnCount})', + values: { columnCount: columns?.length || 0 }, + })} emptyMessage={_t('tableEditor.nocolumnsdefined', { defaultMessage: 'No columns defined' })} clickable on:clickrow={e => showModal(ColumnEditorModal, { columnInfo: e.detail, tableInfo, setTableInfo, driver })} @@ -217,9 +220,7 @@ text: _t('tableEditor.copydefinitions', { defaultMessage: 'Copy definitions' }), icon: 'icon copy', onClick: selected => { - const names = selected - .map(x => `${x.columnName} ${x.dataType}${x.notNull ? ' NOT NULL' : ''}`) - .join(',\n'); + const names = selected.map(x => `${x.columnName} ${x.dataType}${x.notNull ? ' NOT NULL' : ''}`).join(',\n'); navigator.clipboard.writeText(names); }, }, @@ -288,9 +289,21 @@ : null, ]} > - {row?.notNull ? _t('tableEditor.notnull', { defaultMessage: 'NOT NULL' }) : _t('tableEditor.null', { defaultMessage: 'NULL' })} - {row?.isSparse ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })} - {row?.isPersisted ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })} + {row?.notNull + ? _t('tableEditor.notnull', { defaultMessage: 'NOT NULL' }) + : _t('tableEditor.null', { defaultMessage: 'NULL' })} + {row?.isSparse + ? _t('tableEditor.yes', { defaultMessage: 'YES' }) + : _t('tableEditor.no', { defaultMessage: 'NO' })} + {row?.isPersisted + ? _t('tableEditor.yes', { defaultMessage: 'YES' }) + : _t('tableEditor.no', { defaultMessage: 'NO' })} { @@ -299,8 +312,16 @@ }}>{_t('tableEditor.remove', { defaultMessage: 'Remove' })} - {row?.isUnsigned ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })} - {row?.isZerofill ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })} + {row?.isUnsigned + ? _t('tableEditor.yes', { defaultMessage: 'YES' }) + : _t('tableEditor.no', { defaultMessage: 'NO' })} + {row?.isZerofill + ? _t('tableEditor.yes', { defaultMessage: 'YES' }) + : _t('tableEditor.no', { defaultMessage: 'NO' })} @@ -321,7 +342,10 @@ 0 ? addIndex : null} - title={_t('tableEditor.indexes', { defaultMessage: 'Indexes ({indexCount})', values: { indexCount: indexes?.length || 0 } })} + title={_t('tableEditor.indexes', { + defaultMessage: 'Indexes ({indexCount})', + values: { indexCount: indexes?.length || 0 }, + })} emptyMessage={isWritable ? _t('tableEditor.noindexdefined', { defaultMessage: 'No index defined' }) : null} clickable on:clickrow={e => showModal(IndexEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo, driver })} @@ -348,7 +372,11 @@ > {row?.columns.map(x => x.columnName).join(', ')} - {row?.isUnique ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })} + {row?.isUnique + ? _t('tableEditor.yes', { defaultMessage: 'YES' }) + : _t('tableEditor.no', { defaultMessage: 'NO' })} { @@ -364,7 +392,10 @@ 0 ? addUnique : null} - title={_t('tableEditor.uniqueConstraints', { defaultMessage: 'Unique constraints ({constraintCount})', values: { constraintCount: uniques?.length || 0 } })} + title={_t('tableEditor.uniqueConstraints', { + defaultMessage: 'Unique constraints ({constraintCount})', + values: { constraintCount: uniques?.length || 0 }, + })} emptyMessage={isWritable ? _t('tableEditor.nouniquedefined', { defaultMessage: 'No unique defined' }) : null} clickable on:clickrow={e => showModal(UniqueEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo })} @@ -401,13 +432,21 @@ 0 ? addForeignKey : null} - title={_t('tableEditor.foreignKeys', { defaultMessage: 'Foreign keys ({foreignKeyCount})', values: { foreignKeyCount: foreignKeys?.length || 0 } })} - emptyMessage={isWritable ? _t('tableEditor.noforeignkeydefined', { defaultMessage: 'No foreign key defined' }) : null} + title={_t('tableEditor.foreignKeys', { + defaultMessage: 'Foreign keys ({foreignKeyCount})', + values: { foreignKeyCount: foreignKeys?.length || 0 }, + })} + emptyMessage={isWritable + ? _t('tableEditor.noforeignkeydefined', { defaultMessage: 'No foreign key defined' }) + : null} clickable onRemove={row => setTableInfo(tbl => editorDeleteConstraint(tbl, row))} on:clickrow={e => showModal(ForeignKeyEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo, dbInfo })} /> - + {/if} diff --git a/packages/web/src/tabs/AppLogTab.svelte b/packages/web/src/tabs/AppLogTab.svelte index 5635dc50d..90b92585d 100644 --- a/packages/web/src/tabs/AppLogTab.svelte +++ b/packages/web/src/tabs/AppLogTab.svelte @@ -24,6 +24,7 @@ createQuickExportHandlerRef, registerQuickExportHandler, } from '../buttons/ToolStripExportButton.svelte'; + import { _t } from '../translations'; let loadedRows = []; let loadedAll = false; @@ -191,8 +192,8 @@ { @@ -202,7 +203,7 @@ /> {#if mode === 'recent'} -
Auto-scroll
+
{_t('logs.autoScroll', { defaultMessage: 'Auto-scroll' })}
Date: +
{_t('logs.date', { defaultMessage: 'Date:' })}
{ dateFilter = value; @@ -225,12 +226,12 @@ data-testid="AdminAuditLogTab_addFilter" icon="icon filter" menu={[ - { text: 'Connection ID', onClick: () => filterBy('conid') }, - { text: 'Database', onClick: () => filterBy('database') }, - { text: 'Engine', onClick: () => filterBy('engine') }, - { text: 'Message code', onClick: () => filterBy('msgcode') }, - { text: 'Caller', onClick: () => filterBy('caller') }, - { text: 'Name', onClick: () => filterBy('name') }, + { text: _t('logs.connectionId', { defaultMessage: 'Connection ID' }), onClick: () => filterBy('conid') }, + { text: _t('logs.database', { defaultMessage: 'Database' }), onClick: () => filterBy('database') }, + { text: _t('logs.engine', { defaultMessage: 'Engine' }), onClick: () => filterBy('engine') }, + { text: _t('logs.messageCode', { defaultMessage: 'Message code' }), onClick: () => filterBy('msgcode') }, + { text: _t('logs.caller', { defaultMessage: 'Caller' }), onClick: () => filterBy('caller') }, + { text: _t('logs.name', { defaultMessage: 'Name' }), onClick: () => filterBy('name') }, ]} /> @@ -259,15 +260,15 @@ - - - - - - - - - + + + + + + + + + @@ -299,14 +300,14 @@
-
Message code:
+
{_t('logs.messageCode', { defaultMessage: 'Message code:' })}
{#if mode == 'date'} doSetFilter('msgcode', [row.msgcode])}>{row.msgcode || 'N/A'} {:else} @@ -314,15 +315,15 @@ {/if}
-
Message:
+
{_t('logs.message', { defaultMessage: 'Message:' })}
{row.msg}
-
Time:
+
{_t('logs.time', { defaultMessage: 'Time:' })}
{row.time ? format(new Date(parseInt(row.time)), 'yyyy-MM-dd HH:mm:ss') : ''}
-
Caller:
+
{_t('logs.caller', { defaultMessage: 'Caller:' })}
{#if mode == 'date'} doSetFilter('caller', [row.caller])}>{row.caller || 'N/A'} {:else} @@ -330,7 +331,7 @@ {/if}
-
Name:
+
{_t('logs.name', { defaultMessage: 'Name:' })}
{#if mode == 'date'} doSetFilter('name', [row.name])}>{row.name || 'N/A'} {:else} @@ -339,7 +340,7 @@
{#if row.conid}
-
Connection ID:
+
{_t('logs.connectionId', { defaultMessage: 'Connection ID:' })}
{#if mode == 'date'} doSetFilter('conid', [row.conid])} >{formatPossibleUuid(row.conid)} -
Database:
+
{_t('logs.database', { defaultMessage: 'Database:' })}
{#if mode == 'date'} doSetFilter('database', [row.database])}>{row.database} {:else} @@ -361,7 +362,7 @@ {/if} {#if row.engine}
-
Engine:
+
{_t('logs.engine', { defaultMessage: 'Engine:' })}
{#if mode == 'date'} doSetFilter('engine', [row.engine])}>{row.engine} {:else} @@ -381,13 +382,13 @@ {/each} {#if !loadedRows?.length && mode === 'date'}
- + {/if} {#if !loadedAll && mode === 'date'} {#key loadedRows} - + {/key} {/if} @@ -402,7 +403,7 @@ data-testid="AdminAuditLogTab_refreshButton" on:click={() => { reloadData(); - }}>Refresh{_t('logs.refresh', { defaultMessage: 'Refresh' })} diff --git a/packages/web/src/tabs/CommandListTab.svelte b/packages/web/src/tabs/CommandListTab.svelte index cf2f6c850..4cc9a9691 100644 --- a/packages/web/src/tabs/CommandListTab.svelte +++ b/packages/web/src/tabs/CommandListTab.svelte @@ -13,6 +13,7 @@ import CommandModal from '../modals/CommandModal.svelte'; import { showModal } from '../modals/modalTools'; import { commandsCustomized } from '../stores'; + import { _tval } from '../translations'; $: commandList = _.sortBy(_.values($commandsCustomized), ['category', 'name']); let filter; @@ -27,7 +28,9 @@
filterName(filter, cmd['category'], cmd['name'], cmd['keyText'], cmd['id']))} + rows={commandList.filter(cmd => + filterName(filter, _tval(cmd['category']), _tval(cmd['name']), _tval(cmd['keyText']), cmd['id']) + )} columns={[ { header: 'Category', fieldName: 'category' }, { header: 'Name', fieldName: 'name' }, diff --git a/packages/web/src/tabs/DiagramTab.svelte b/packages/web/src/tabs/DiagramTab.svelte index 162cbe6da..ae76294f8 100644 --- a/packages/web/src/tabs/DiagramTab.svelte +++ b/packages/web/src/tabs/DiagramTab.svelte @@ -8,6 +8,7 @@ folder: 'diagrams', format: 'json', fileExtension: 'diagram', + defaultTeamFolder: true, undoRedo: true, }); diff --git a/packages/web/src/tabs/ImportExportTab.svelte b/packages/web/src/tabs/ImportExportTab.svelte index 0c70cb357..34885c418 100644 --- a/packages/web/src/tabs/ImportExportTab.svelte +++ b/packages/web/src/tabs/ImportExportTab.svelte @@ -10,6 +10,7 @@ fileExtension: 'impexp', // undoRedo: true, + defaultTeamFolder: true, }); @@ -53,6 +54,7 @@ import uuidv1 from 'uuid/v1'; import { tick } from 'svelte'; import { showSnackbarError } from '../utility/snackbar'; + import { _t } from '../translations'; let busy = false; let executeNumber = 0; @@ -288,21 +290,21 @@ /> {#if busy} - + {/if}
- + - - - + + + @@ -329,15 +331,15 @@ {#if busy} Stop{_t('importExport.stop', { defaultMessage: "Stop" })} {:else} Run{_t('importExport.run', { defaultMessage: "Run" })} {/if} Generate script{_t('importExport.generateScript', { defaultMessage: "Generate script" })} diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index facb19f1a..1ee85dce6 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -52,6 +52,7 @@ findReplace: true, executeAdditionalCondition: () => getCurrentEditor()?.hasConnection() && hasPermission('dbops/query'), copyPaste: true, + defaultTeamFolder: true, }); registerCommand({ id: 'query.executeCurrent', @@ -123,8 +124,9 @@ + + + + + + \ No newline at end of file diff --git a/packages/web/src/tabs/ShellTab.svelte b/packages/web/src/tabs/ShellTab.svelte index 4875601de..bbbe65ff2 100644 --- a/packages/web/src/tabs/ShellTab.svelte +++ b/packages/web/src/tabs/ShellTab.svelte @@ -12,6 +12,7 @@ execute: true, toggleComment: true, findReplace: true, + defaultTeamFolder: true, executeAdditionalCondition: () => getCurrentConfig().allowShellScripting, }); diff --git a/packages/web/src/tabs/index.js b/packages/web/src/tabs/index.js index f8c0cdd8b..1e34e5102 100644 --- a/packages/web/src/tabs/index.js +++ b/packages/web/src/tabs/index.js @@ -25,6 +25,7 @@ import * as ServerSummaryTab from './ServerSummaryTab.svelte'; import * as ImportExportTab from './ImportExportTab.svelte'; import * as SqlObjectTab from './SqlObjectTab.svelte'; import * as AppLogTab from './AppLogTab.svelte'; +import * as SettingsTab from './SettingsTab.svelte'; import protabs from './index-pro'; @@ -56,5 +57,6 @@ export default { ImportExportTab, SqlObjectTab, AppLogTab, + SettingsTab, ...protabs, }; diff --git a/packages/web/src/translations.ts b/packages/web/src/translations.ts index 2abe830d3..00b30f9e2 100644 --- a/packages/web/src/translations.ts +++ b/packages/web/src/translations.ts @@ -6,6 +6,7 @@ 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'; @@ -22,6 +23,7 @@ const translations = { es, pt, it, + ja, }; const supportedLanguages = Object.keys(translations); @@ -31,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; @@ -51,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 { diff --git a/packages/web/src/utility/common.ts b/packages/web/src/utility/common.ts index 477d56670..71bcca5c8 100644 --- a/packages/web/src/utility/common.ts +++ b/packages/web/src/utility/common.ts @@ -4,6 +4,8 @@ import _ from 'lodash'; import { getSchemaList } from './metadataLoaders'; import { showSnackbarError } from './snackbar'; import { _t } from '../translations'; +import { apiCall } from './api'; +import getElectron from './getElectron'; export class LoadingToken { isCanceled = false; @@ -63,7 +65,8 @@ export function getObjectTypeFieldLabel(objectTypeField, driver?) { if (objectTypeField == 'procedures') return _t('dbObject.procedures', { defaultMessage: 'Procedures' }); if (objectTypeField == 'functions') return _t('dbObject.functions', { defaultMessage: 'Functions' }); if (objectTypeField == 'triggers') return _t('dbObject.triggers', { defaultMessage: 'Triggers' }); - if (objectTypeField == 'schedulerEvents') return _t('dbObject.schedulerEvents', { defaultMessage: 'Scheduler Events' }); + if (objectTypeField == 'schedulerEvents') + return _t('dbObject.schedulerEvents', { defaultMessage: 'Scheduler Events' }); if (objectTypeField == 'matviews') return _t('dbObject.matviews', { defaultMessage: 'Materialized Views' }); if (objectTypeField == 'collections') return _t('dbObject.collections', { defaultMessage: 'Collections/Containers' }); return _.startCase(objectTypeField); @@ -151,3 +154,40 @@ export function getKeyTextFromEvent(e) { keyText += e.key; return keyText; } + +export function getDatabasStatusMenu(dbid) { + function callSchemalListChanged() { + apiCall('database-connections/dispatch-database-changed-event', { event: 'schema-list-changed', ...dbid }); + } + return [ + { + text: _t('command.database.refreshIncremental', { defaultMessage: 'Refresh DB structure (incremental)' }), + onClick: () => { + apiCall('database-connections/sync-model', dbid); + callSchemalListChanged(); + }, + }, + { + text: _t('command.database.refreshFull', { defaultMessage: 'Refresh DB structure (full)' }), + onClick: () => { + apiCall('database-connections/sync-model', { ...dbid, isFullRefresh: true }); + callSchemalListChanged(); + }, + }, + { + text: _t('command.database.reopenConnection', { defaultMessage: 'Reopen connection' }), + onClick: () => { + apiCall('database-connections/refresh', dbid); + callSchemalListChanged(); + }, + }, + { + text: _t('command.database.disconnect', { defaultMessage: 'Disconnect' }), + onClick: () => { + const electron = getElectron(); + if (electron) apiCall('database-connections/disconnect', dbid); + switchCurrentDatabase(null); + }, + }, + ]; +} diff --git a/packages/web/src/utility/saveTabFile.ts b/packages/web/src/utility/saveTabFile.ts index c47c66173..66946ec6b 100644 --- a/packages/web/src/utility/saveTabFile.ts +++ b/packages/web/src/utility/saveTabFile.ts @@ -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, }); } diff --git a/packages/web/src/utility/tableRestoreScript.ts b/packages/web/src/utility/tableRestoreScript.ts new file mode 100644 index 000000000..ae768f5ea --- /dev/null +++ b/packages/web/src/utility/tableRestoreScript.ts @@ -0,0 +1,132 @@ +import _ from 'lodash'; +import { Condition, dumpSqlInsert, dumpSqlUpdate, Insert, Update, Delete, dumpSqlDelete } from 'dbgate-sqltree'; +import { TableInfo, SqlDumper } from 'dbgate-types'; + +export function createTableRestoreScript(backupTable: TableInfo, originalTable: TableInfo, dmp: SqlDumper) { + const bothColumns = _.intersection( + backupTable.columns.map(x => x.columnName), + originalTable.columns.map(x => x.columnName) + ); + const keyColumns = _.intersection( + originalTable.primaryKey?.columns?.map(x => x.columnName) || [], + backupTable.columns.map(x => x.columnName) + ); + const valueColumns = _.difference(bothColumns, keyColumns); + + function makeColumnCond(colName: string, operator: '=' | '<>' | '<' | '>' | '<=' | '>=' = '='): Condition { + return { + conditionType: 'binary', + operator, + left: { + exprType: 'column', + columnName: colName, + source: { name: originalTable }, + }, + right: { + exprType: 'column', + columnName: colName, + source: { alias: 'bak' }, + }, + }; + } + + function putTitle(title: string) { + dmp.putRaw('\n\n'); + dmp.comment(`******************** ${title} ********************`); + dmp.putRaw('\n'); + } + + dmp.comment(`Restoring data into table ${originalTable.pureName} from backup table ${backupTable.pureName}`); + dmp.putRaw('\n'); + dmp.comment(`Key columns: ${keyColumns.join(', ')}`); + dmp.putRaw('\n'); + dmp.comment(`Value columns: ${valueColumns.join(', ')}`); + dmp.putRaw('\n'); + dmp.comment(`Follows UPDATE, DELETE, INSERT statements to restore data`); + dmp.putRaw('\n'); + + const update: Update = { + commandType: 'update', + from: { name: originalTable }, + fields: valueColumns.map(colName => ({ + exprType: 'select', + select: { + commandType: 'select', + from: { name: backupTable, alias: 'bak' }, + columns: [ + { + exprType: 'column', + columnName: colName, + source: { alias: 'bak' }, + }, + ], + where: { + conditionType: 'and', + conditions: keyColumns.map(colName => makeColumnCond(colName)), + }, + }, + targetColumn: colName, + })), + where: { + conditionType: 'exists', + subQuery: { + commandType: 'select', + from: { name: backupTable, alias: 'bak' }, + selectAll: true, + where: { + conditionType: 'and', + conditions: [ + ...keyColumns.map(keyColName => makeColumnCond(keyColName)), + { + conditionType: 'or', + conditions: valueColumns.map(colName => makeColumnCond(colName, '<>')), + }, + ], + }, + }, + }, + }; + putTitle('UPDATE'); + dumpSqlUpdate(dmp, update); + dmp.endCommand(); + + const delcmd: Delete = { + commandType: 'delete', + from: { name: originalTable }, + where: { + conditionType: 'notExists', + subQuery: { + commandType: 'select', + from: { name: backupTable, alias: 'bak' }, + selectAll: true, + where: { + conditionType: 'and', + conditions: keyColumns.map(colName => makeColumnCond(colName)), + }, + }, + }, + }; + putTitle('DELETE'); + dumpSqlDelete(dmp, delcmd); + dmp.endCommand(); + + const insert: Insert = { + commandType: 'insert', + targetTable: originalTable, + fields: bothColumns.map(colName => ({ + targetColumn: colName, + exprType: 'column', + columnName: colName, + source: { alias: 'bak' }, + })), + whereNotExistsSource: { name: backupTable, alias: 'bak' }, + insertWhereNotExistsCondition: { + conditionType: 'and', + conditions: keyColumns.map(colName => makeColumnCond(colName)), + }, + }; + + putTitle('INSERT'); + dumpSqlInsert(dmp, insert); + dmp.endCommand(); +} diff --git a/packages/web/src/widgets/CellDataWidget.svelte b/packages/web/src/widgets/CellDataWidget.svelte index 783b8084c..8175b86e8 100644 --- a/packages/web/src/widgets/CellDataWidget.svelte +++ b/packages/web/src/widgets/CellDataWidget.svelte @@ -101,6 +101,7 @@ import WidgetTitle from './WidgetTitle.svelte'; import JsonExpandedCellView from '../celldata/JsonExpandedCellView.svelte'; import XmlCellView from '../celldata/XmlCellView.svelte'; + import { _t } from '../translations'; let selectedFormatType = 'autodetect'; @@ -116,7 +117,7 @@
- Cell data view + {_t('cellDataWidget.title', { defaultMessage: "Cell data view" })}
Format:  @@ -126,18 +127,18 @@ on:change={e => (selectedFormatType = e.detail)} data-testid="CellDataWidget_selectFormat" options={[ - { value: 'autodetect', label: `Autodetect - ${autodetectFormat.title}` }, + { value: 'autodetect', label: _t('cellDataWidget.autodetect', { defaultMessage: "Autodetect - {autoDetectTitle}", values : { autoDetectTitle: autodetectFormat.title } }) }, ...formats.map(fmt => ({ label: fmt.title, value: fmt.type })), ]} />
{#if usedFormat.single && selection?.length != 1} - + {:else if usedFormat == null} - + {:else if !selection || selection.length == 0} - + {:else} {/if} diff --git a/packages/web/src/widgets/FilesWidget.svelte b/packages/web/src/widgets/FilesWidget.svelte index 657b793e8..51a0ea96d 100644 --- a/packages/web/src/widgets/FilesWidget.svelte +++ b/packages/web/src/widgets/FilesWidget.svelte @@ -19,12 +19,12 @@ - + {#if hasPermission('files/favorites/read')} - + diff --git a/packages/web/src/widgets/HistoryWidget.svelte b/packages/web/src/widgets/HistoryWidget.svelte index a5210f26f..a9988f2de 100644 --- a/packages/web/src/widgets/HistoryWidget.svelte +++ b/packages/web/src/widgets/HistoryWidget.svelte @@ -13,13 +13,14 @@ import WidgetColumnBar from './WidgetColumnBar.svelte'; import WidgetColumnBarItem from './WidgetColumnBarItem.svelte'; import WidgetsInnerContainer from './WidgetsInnerContainer.svelte'; + import { _t } from '../translations'; $: favorites = useFavorites(); - + - + diff --git a/packages/web/src/widgets/PluginsWidget.svelte b/packages/web/src/widgets/PluginsWidget.svelte index a44880f1f..8502e0eea 100644 --- a/packages/web/src/widgets/PluginsWidget.svelte +++ b/packages/web/src/widgets/PluginsWidget.svelte @@ -4,13 +4,15 @@ import WidgetColumnBar from './WidgetColumnBar.svelte'; import WidgetColumnBarItem from './WidgetColumnBarItem.svelte'; + + import { _t } from '../translations'; - + - + diff --git a/packages/web/src/widgets/PublicCloudWidget.svelte b/packages/web/src/widgets/PublicCloudWidget.svelte index a14c49d9f..cb6b39270 100644 --- a/packages/web/src/widgets/PublicCloudWidget.svelte +++ b/packages/web/src/widgets/PublicCloudWidget.svelte @@ -30,11 +30,11 @@ - + @@ -52,9 +52,9 @@
- Only files relevant for your connections, platform and DbGate edition are listed. Please define connections at first. + {_t('publicCloudWidget.onlyRelevantFilesListed', { defaultMessage: "Only files relevant for your connections, platform and DbGate edition are listed. Please define connections at first." })}
- +
{/if}
diff --git a/packages/web/src/widgets/QueryHistoryList.svelte b/packages/web/src/widgets/QueryHistoryList.svelte index f6436df20..77767abd5 100644 --- a/packages/web/src/widgets/QueryHistoryList.svelte +++ b/packages/web/src/widgets/QueryHistoryList.svelte @@ -9,6 +9,7 @@ import openNewTab from '../utility/openNewTab'; import CloseSearchButton from '../buttons/CloseSearchButton.svelte'; import { apiCall, apiOff, apiOn } from '../utility/api'; + import { _t } from '../translations'; let filter = ''; let search = ''; @@ -38,7 +39,7 @@ - + { @@ -54,7 +55,7 @@ on:click={() => { openNewTab( { - title: 'Query #', + title: _t('database.queryDesigner', { defaultMessage: "Query #" }), icon: 'icon sql-file', tabComponent: 'QueryTab', focused: true, diff --git a/packages/web/src/widgets/SavedFilesList.svelte b/packages/web/src/widgets/SavedFilesList.svelte index 095794588..ea24ceeb0 100644 --- a/packages/web/src/widgets/SavedFilesList.svelte +++ b/packages/web/src/widgets/SavedFilesList.svelte @@ -13,6 +13,7 @@ import { isProApp } from '../utility/proTools'; import InlineUploadButton from '../buttons/InlineUploadButton.svelte'; import { DATA_FOLDER_NAMES } from 'dbgate-tools'; + import { _t } from '../translations'; let filter = ''; @@ -65,19 +66,19 @@ - + - + @@ -86,7 +87,7 @@ (data.teamFileId ? 'Team files' : dataFolderTitle(data.folder))} + groupFunc={data => (data.teamFileId ? _t('files.teamFiles', { defaultMessage: "Team files" }) : dataFolderTitle(data.folder))} {filter} /> diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index cf9c2c81d..8dbabeae8 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -31,7 +31,7 @@ import { chevronExpandIcon } from '../icons/expandIcons'; import ErrorInfo from '../elements/ErrorInfo.svelte'; import LoadingInfo from '../elements/LoadingInfo.svelte'; - import { getObjectTypeFieldLabel } from '../utility/common'; + import { getDatabasStatusMenu, getObjectTypeFieldLabel } from '../utility/common'; import DropDownButton from '../buttons/DropDownButton.svelte'; import FontIcon from '../icons/FontIcon.svelte'; import CloseSearchButton from '../buttons/CloseSearchButton.svelte'; @@ -120,11 +120,6 @@ // setInterval(() => (generateIndex += 1), 2000); // $: objectList = generateObjectList(generateIndex); - const handleRefreshDatabase = () => { - apiCall('database-connections/refresh', { conid, database }); - apiCall('database-connections/dispatch-database-changed-event', { event: 'schema-list-changed', conid, database }); - }; - function createAddMenu() { const res = []; if (driver?.databaseEngineTypes?.includes('document')) { @@ -147,6 +142,15 @@ return res; } + function createRefreshDatabaseMenu() { + return getDatabasStatusMenu({ conid, database }); + } + + function handleFullRefreshDatabase() { + apiCall('database-connections/sync-model', { conid, database, isFullRefresh: true }); + apiCall('database-connections/dispatch-database-changed-event', { event: 'schema-list-changed', conid, database }); + } + function createSearchMenu() { const res = []; res.push({ label: _t('sqlObject.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); @@ -228,6 +232,15 @@ $focusedConnectionOrDatabase?.database != extractDbNameFromComposite(database))); // $: console.log('STATUS', $status); + + function getAppObjectGroup(data) { + if (data.objectTypeField == 'tables') { + if (data.pureName.match(databaseObjectAppObject.TABLE_BACKUP_REGEX)) { + return _t('dbObject.tableBackups', { defaultMessage: 'Table Backups' }); + } + } + return getObjectTypeFieldLabel(data.objectTypeField, driver); + } {#if $status && $status.name == 'error'} @@ -237,7 +250,18 @@ - {_t('common.refresh', { defaultMessage: 'Refresh' })} + {_t('common.refresh', { defaultMessage: 'Refresh' })} + + {:else if objectList.length == 0 && $status && $status.name != 'pending' && $status.name != 'checkStructure' && $status.name != 'loadStructure' && $objects}
- {_t('common.refresh', { defaultMessage: 'Refresh' })} + {_t('common.refresh', { defaultMessage: 'Refresh' })} {#if driver?.databaseEngineTypes?.includes('sql')}
runCommand('new.table')} @@ -298,14 +322,14 @@ {#if !filter} {/if} - - - + icon="icon dots-vertical" + /> x.schemaName == null || ($appliedCurrentSchema ? x.schemaName == $appliedCurrentSchema : true)) .map(x => ({ ...x, conid, database }))} module={databaseObjectAppObject} - groupFunc={data => getObjectTypeFieldLabel(data.objectTypeField, driver)} + groupFunc={getAppObjectGroup} subItemsComponent={(data, { isExpandedBySearch }) => data.objectTypeField == 'procedures' || data.objectTypeField == 'functions' ? isExpandedBySearch diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 4dfef5ab5..505f04946 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -35,16 +35,16 @@ getCurrentConfig().storageDatabase && { icon: 'icon admin', name: 'admin', - title: 'Administration', + title: _t('widgets.administration', { defaultMessage: 'Administration' }), }, { icon: 'icon database', name: 'database', - title: 'Database connections', + title: _t('widgets.databaseConnections', { defaultMessage: 'Database connections' }), }, getCurrentConfig().allowPrivateCloud && { name: 'cloud-private', - title: 'DbGate Cloud', + title: _t('widgets.dbgateCloud', { defaultMessage: 'DbGate Cloud' }), icon: 'icon cloud-private', }, @@ -55,17 +55,17 @@ { icon: 'icon file', name: 'file', - title: 'Favorites & Saved files', + title: _t('widgets.favoritesAndSavedFiles', { defaultMessage: 'Favorites & Saved files' }), }, { icon: 'icon history', name: 'history', - title: 'Query history & Closed tabs', + title: _t('widgets.queryHistoryAndClosedTabs', { defaultMessage: 'Query history & Closed tabs' }), }, isProApp() && { icon: 'icon archive', name: 'archive', - title: 'Archive (saved tabular data)', + title: _t('widgets.archive', { defaultMessage: 'Archive (saved tabular data)' }), }, // { // icon: 'icon plugin', @@ -75,17 +75,17 @@ { icon: 'icon cell-data', name: 'cell-data', - title: 'Selected cell data detail view', + title: _t('widgets.selectedCellDataDetailView', { defaultMessage: 'Selected cell data detail view' }), }, { name: 'cloud-public', - title: 'DbGate Cloud', + title: _t('widgets.dbgateCloud', { defaultMessage: 'DbGate Cloud' }), icon: 'icon cloud-public', }, { icon: 'icon premium', name: 'premium', - title: 'Premium promo', + title: _t('widgets.premiumPromo', { defaultMessage: 'Premium promo' }), isPremiumPromo: true, }, // { @@ -113,32 +113,12 @@ //const handleChangeWidget= e => (selectedWidget.set(item.name)) function handleSettingsMenu() { - const rect = domSettings.getBoundingClientRect(); - const left = rect.right; - const top = rect.bottom; - const items = [ - hasPermission('settings/change') && { command: 'settings.show' }, - { command: 'theme.changeTheme' }, - hasPermission('settings/change') && { command: 'settings.commands' }, - hasPermission('widgets/plugins') && { - text: _t('widgets.managePlugins', { defaultMessage: 'Manage plugins' }), - onClick: () => { - $selectedWidget = 'plugins'; - $visibleWidgetSideBar = true; - }, - }, - hasPermission('application-log') && { - text: _t('widgets.viewApplicationLogs', { defaultMessage: 'View application logs' }), - onClick: () => { - openNewTab({ - title: 'Application log', - icon: 'img applog', - tabComponent: 'AppLogTab', - }); - }, - }, - ]; - currentDropDownMenu.set({ left, top, items }); + openNewTab({ + title: 'Settings', + icon: 'icon settings', + tabComponent: 'SettingsTab', + props: {}, + }); } function handleCloudAccountMenu() { @@ -213,7 +193,7 @@ class="wrapper" on:click={() => showModal(NewObjectModal)} data-testid="WidgetIconPanel_addButton" - title="Add New" + title={_t('widgets.addNew', { defaultMessage: 'Add New' })} >
diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index dfb24af3a..fd4a9f172 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -84,9 +84,7 @@ class Analyser extends DatabaseAnalyser { async _runAnalysis() { this.feedback({ analysingMessage: 'DBGM-00241 Loading tables' }); - const tables = await this.analyserQuery(this.driver.dialect.stringAgg ? 'tableModifications' : 'tableList', [ - 'tables', - ]); + const tables = await this.analyserQuery('tableList', ['tables']); this.feedback({ analysingMessage: 'DBGM-00242 Loading columns' }); const columns = await this.analyserQuery('columns', ['tables', 'views']); @@ -396,9 +394,6 @@ class Analyser extends DatabaseAnalyser { } async _getFastSnapshot() { - const tableModificationsQueryData = this.driver.dialect.stringAgg - ? await this.analyserQuery('tableModifications') - : null; const viewModificationsQueryData = await this.analyserQuery('viewModifications'); const matviewModificationsQueryData = this.driver.dialect.materializedViews ? await this.analyserQuery('matviewModifications') @@ -406,15 +401,7 @@ class Analyser extends DatabaseAnalyser { const routineModificationsQueryData = await this.analyserQuery('routineModifications'); return { - tables: tableModificationsQueryData - ? tableModificationsQueryData.rows.map(x => ({ - 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, + tables: null, views: viewModificationsQueryData.rows.map(x => ({ objectId: `views:${x.schema_name}.${x.pure_name}`, pureName: x.pure_name, diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js index 833153196..38911d0f4 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js @@ -1,5 +1,4 @@ const columns = require('./columns'); -const tableModifications = require('./tableModifications'); const tableList = require('./tableList'); const viewModifications = require('./viewModifications'); const matviewModifications = require('./matviewModifications'); @@ -25,7 +24,6 @@ const fk_keyColumnUsage = require('./fk_key_column_usage'); module.exports = { columns, - tableModifications, tableList, viewModifications, primaryKeys, diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js b/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js index abc2ba9ec..c8f81b872 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js @@ -1,17 +1,24 @@ module.exports = ` -select - table_constraints.constraint_schema as "constraint_schema", - table_constraints.constraint_name as "constraint_name", - table_constraints.table_schema as "schema_name", - table_constraints.table_name as "pure_name", - key_column_usage.column_name as "column_name" -from information_schema.table_constraints -inner join information_schema.key_column_usage on table_constraints.table_name = key_column_usage.table_name and table_constraints.constraint_name = key_column_usage.constraint_name - and table_constraints.table_schema = key_column_usage.table_schema -where - table_constraints.table_schema !~ '^_timescaledb_' - and table_constraints.constraint_type = 'PRIMARY KEY' - and ('tables:' || table_constraints.table_schema || '.' || table_constraints.table_name) =OBJECT_ID_CONDITION - and table_constraints.table_schema =SCHEMA_NAME_CONDITION -order by key_column_usage.ordinal_position +SELECT + n.nspname AS "constraint_schema", + c.conname AS "constraint_name", + n.nspname AS "schema_name", + t.relname AS "pure_name", + a.attname AS "column_name" +FROM pg_catalog.pg_constraint AS c +JOIN pg_catalog.pg_class AS t + ON t.oid = c.conrelid +JOIN pg_catalog.pg_namespace AS n + ON n.oid = t.relnamespace +JOIN LATERAL unnest(c.conkey) WITH ORDINALITY AS cols(attnum, ordinal_position) + ON TRUE +JOIN pg_catalog.pg_attribute AS a + ON a.attrelid = t.oid + AND a.attnum = cols.attnum +WHERE + c.contype = 'p' -- PRIMARY KEY + AND n.nspname !~ '^_timescaledb_' + AND ('tables:' || n.nspname || '.' || t.relname) =OBJECT_ID_CONDITION + AND n.nspname =SCHEMA_NAME_CONDITION +ORDER BY cols.ordinal_position `; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js b/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js index 37b004655..af1261db4 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js @@ -5,6 +5,6 @@ from information_schema.tables infoTables where infoTables.table_type not like '%VIEW%' and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION and infoTables.table_schema <> 'pg_internal' -and infoTables.table_schema !~ '^_timescaledb_' +and infoTables.table_schema !~ '^_timescaledb_' and infoTables.table_schema =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js b/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js deleted file mode 100644 index 8d87142d0..000000000 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = ` -select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name", - ( - select $md5Function(string_agg( - infoColumns.column_name || '|' || infoColumns.data_type || '|' || infoColumns.is_nullable::varchar(255) || '|' || coalesce(infoColumns.character_maximum_length, -1)::varchar(255) - || '|' || coalesce(infoColumns.numeric_precision, -1)::varchar(255) , - ',' order by infoColumns.ordinal_position - )) as "hash_code_columns" - from information_schema.columns infoColumns - where infoColumns.table_schema = infoTables.table_schema and infoColumns.table_name = infoTables.table_name - ), - ( - select $md5Function(string_agg( - infoConstraints.constraint_name || '|' || infoConstraints.constraint_type , - ',' order by infoConstraints.constraint_name - )) 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%' - and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION -and infoTables.table_schema <> 'pg_internal' -and infoTables.table_schema !~ '^_timescaledb_' -and infoTables.table_schema =SCHEMA_NAME_CONDITION -`; diff --git a/translations/cs.json b/translations/cs.json index 62a37d4be..a40c58116 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -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" -} \ No newline at end of file +} diff --git a/translations/de.json b/translations/de.json index 745287340..4a57c54f9 100644 --- a/translations/de.json +++ b/translations/de.json @@ -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" } diff --git a/translations/en.json b/translations/en.json index bb7b1fe17..69fc96c90 100644 --- a/translations/en.json +++ b/translations/en.json @@ -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" } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json index 771f4461b..a3dcadf39 100644 --- a/translations/es.json +++ b/translations/es.json @@ -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" } diff --git a/translations/fr.json b/translations/fr.json index 7d04e6b70..b90fc1586 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -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" } diff --git a/translations/it.json b/translations/it.json index 870d70325..c8965265f 100644 --- a/translations/it.json +++ b/translations/it.json @@ -3,7 +3,11 @@ "app.loading_plugin": "Caricamento plugin {plugin} ...", "app.preparingPlugins": "Preparazione plugin ...", "app.starting": "Avvio DbGate", - "connection.authToken": "Token di autenticazione", + "cellDataWidget.autodetect": "Rilevamento automatico - {autoDetectTitle}", + "cellDataWidget.formatNotSelected": "Formato non selezionato", + "cellDataWidget.mustSelectOneCell": "Deve essere selezionata una cella", + "cellDataWidget.noDataSelected": "Nessun dato selezionato", + "cellDataWidget.title": "Vista dati cella", "chart.detect": "Rileva grafico", "chart.open": "Apri grafico", "clipboard.SQLInsert": "SQL INSERTs", @@ -41,6 +45,10 @@ "columnEditor.isSparse": "Sparse", "columnEditor.isUnsigned": "Unsigned", "columnEditor.isZerofill": "Zero fill", + "columnLine.addReference": "Aggiungi riferimento", + "columnLine.sortAscending": "Ordina crescente", + "columnLine.sortDescending": "Ordina decrescente", + "columnLine.unsort": "Rimuovi ordinamento", "columnsConstraintEditor.addNewColumn": "Aggiungi nuova colonna", "columnsConstraintEditor.chooseColumn": "Scegli colonna", "columnsConstraintEditor.selectColumn": "Seleziona colonna", @@ -290,6 +298,7 @@ "commandModal.showKeyCombination": "Mostra la combinazione di tasti desiderata e premi INVIO", "common.addNew": "Aggiungi nuovo", "common.advanced": "Avanzate", + "common.allFields": "Tutti {field}", "common.archive": "Archivio (JSONL)", "common.cancel": "Annulla", "common.close": "Chiudi", @@ -316,6 +325,7 @@ "common.kill": "Termina", "common.loadingData": "Caricamento dati", "common.name": "Nome", + "common.newConnection": "Nuova connessione", "common.notSelectedOptional": "(non selezionato - opzionale)", "common.parameters": "Parametri", "common.passwordEncrypted": "La password è crittografata", @@ -325,6 +335,7 @@ "common.queryEditor": "Editor query SQL", "common.refresh": "Aggiorna", "common.remove": "Rimuovi", + "common.removeAll": "Rimuovi tutto", "common.reset": "Ripristina", "common.save": "Salva", "common.saveAndNext": "Salva e avanti", @@ -332,6 +343,7 @@ "common.schema": "Schema", "common.search": "Cerca", "common.searchBy": "Cerca per:", + "common.server": "Server", "common.sqlGenerator": "Generatore SQL", "common.table": "Tabella", "common.testingConnection": "Test connessione", @@ -340,6 +352,7 @@ "connection.allowedDatabasesRegex": "Espressione regolare database consentiti", "connection.askPassword": "Non salvare, richiedi password", "connection.askUser": "Non salvare, richiedi login e password", + "connection.authToken": "Token di autenticazione", "connection.authentication": "Autenticazione", "connection.autoDetectNatMap": "Rileva automaticamente mappa NAT (usa per Redis Cluster in rete Docker)", "connection.chooseType": "Scegli tipo", @@ -574,6 +587,12 @@ "dbObject.triggers": "Trigger", "dbObject.truncateTable": "Truncate tabella", "dbObject.views": "Viste", + "designerTable.addReferences": "Aggiungi riferimenti", + "designerTable.changeColor": "Cambia colore", + "designerTable.defineVirtualForeignKey": "Definisci chiave esterna virtuale", + "designerTable.newAlias": "Nuovo alias", + "designerTable.removeTableAlias": "Rimuovi alias tabella", + "designerTable.setTableAlias": "Imposta alias tabella", "error.driverNotFound": "Connessione database non valida, driver non trovato", "error.selectedCloudConnection": "La connessione selezionata è da DbGate cloud", "error.selectedNotCloudConnection": "La connessione selezionata non è da DbGate cloud", @@ -588,6 +607,15 @@ "file.queryDesignerFiles": "File designer query", "file.sqlFiles": "File SQL", "file.sqliteDatabase": "Database SQLite", + "files.allSupportedFiles": "Tutti i file supportati", + "files.favorites": "Preferiti", + "files.openFile": "Apri file", + "files.refreshFiles": "Aggiorna file", + "files.savedFiles": "File salvati", + "files.searchSavedFiles": "Cerca file salvati", + "files.sqlFiles": "File SQL", + "files.teamFiles": "File team", + "files.uploadFile": "Carica file", "filter.after": "Dopo...", "filter.and": "E", "filter.arrayIsEmpty": "Array è vuoto", @@ -669,16 +697,69 @@ "foreignKeyEditor.refColumn": "Colonna rif - ", "foreignKeyEditor.referencedTable": "Tabella referenziata", "foreignKeyEditor.tableNotSet": "(tabella non impostata)", + "history.queryHistory": "Cronologia query", + "history.recentlyClosedTabs": "Schede chiuse di recente", + "history.searchQueryHistory": "Cerca nella cronologia query", + "importExport.action": "Azione", + "importExport.addWebUrl": "Aggiungi URL web", + "importExport.advancedConfiguration": "Configurazione avanzata", + "importExport.archiveFolder": "Cartella archivio", + "importExport.columns": "Colonne", "importExport.createZipFileInArchive": "Crea file ZIP nell'archivio", + "importExport.currentArchive": "Archivio corrente", + "importExport.currentDatabase": "DB corrente", + "importExport.dragDropImportedFilesHere": "Trascina e rilascia qui i file da importare", "importExport.exportToZipArchive": "Archivio ZIP di output", "importExport.exportToZipFile": "Esporta in file ZIP", + "importExport.generateScript": "Genera script", "importExport.importFromZipArchive": "Archivio ZIP di input", "importExport.importFromZipFile": "Importa da file ZIP (nella cartella archivio)", + "importExport.mapSourceTablesFiles": "Mappa tabelle/file sorgente", + "importExport.messages": "Messaggi", + "importExport.newArchive": "Nuovo archivio", + "importExport.outputFiles": "File di output", + "importExport.preview": "Anteprima", + "importExport.processingImportExport": "Elaborazione import/export ...", + "importExport.run": "Esegui", + "importExport.schedule": "Pianifica", + "importExport.source": "Sorgente", + "importExport.sourceConfiguration": "Configurazione sorgente", "importExport.sourceFiles": "File sorgente", + "importExport.startVariableIndex": "Indice variabile iniziale", + "importExport.status": "Stato", + "importExport.stop": "Ferma", + "importExport.storageType": "Tipo archiviazione", "importExport.tablesViewsCollections": "Tabelle / viste / collezioni", + "importExport.target": "Destinazione", + "importExport.targetConfiguration": "Configurazione destinazione", "indexEditor.filteredIndexCondition": "Condizione indice filtrato", "indexEditor.indexName": "Nome indice", "indexEditor.isUnique": "È indice univoco", + "logs.autoScroll": "Scorrimento automatico", + "logs.caller": "Chiamante:", + "logs.callerTab": "Chiamante", + "logs.chooseDate": "Scegli data", + "logs.codeTab": "Codice", + "logs.connectionId": "ID connessione:", + "logs.connectionTab": "Connessione", + "logs.database": "Database:", + "logs.databaseTab": "Database", + "logs.date": "Data:", + "logs.dateTab": "Data", + "logs.details": "Dettagli", + "logs.engine": "Motore:", + "logs.engineTab": "Motore", + "logs.loadingNextRows": "Caricamento righe successive...", + "logs.message": "Messaggio:", + "logs.messageCode": "Codice messaggio:", + "logs.messageTab": "Messaggio", + "logs.name": "Nome:", + "logs.nameTab": "Nome", + "logs.noDataForSelectedDate": "Nessun dato per la data selezionata", + "logs.recentLogs": "Log recenti", + "logs.refresh": "Aggiorna", + "logs.time": "Ora:", + "logs.timeTab": "Ora", "menu.edit": "Modifica", "menu.file": "File", "menu.help": "Aiuto", @@ -703,6 +784,11 @@ "newObject.sqlGeneratorDisabled": "Il generatore SQL non è disponibile per il database corrente", "newObject.tableDescription": "Crea tabella nel database corrente", "newObject.tableDisabled": "La creazione tabella non è disponibile per il database corrente", + "plugins.searchExtensionsOnWeb": "Cerca estensioni sul web", + "publicCloudWidget.onlyRelevantFilesListed": "Sono elencati solo i file rilevanti per le tue connessioni, piattaforma ed edizione DbGate. Definisci prima le connessioni.", + "publicCloudWidget.refreshFiles": "Aggiorna file", + "publicCloudWidget.refreshList": "Aggiorna elenco", + "publicCloudWidget.searchPublicFiles": "Cerca file pubblici", "query.limitRows": "Limita a {queryRowsLimit} righe", "query.named": ":variabile", "query.noParameters": "(nessun parametro)", @@ -819,10 +905,14 @@ "sqlObject.columnName": "Nome colonna", "sqlObject.databaseEmpty": "Il database {database} è vuoto o la struttura non è caricata, premi il pulsante Aggiorna per ricaricare la struttura", "sqlObject.loadingStructure": "Caricamento struttura database", + "sqlObject.name": "Nome", "sqlObject.newCollection": "Nuova collezione/container", + "sqlObject.rowCount": "Conteggio righe", "sqlObject.schemaName": "Schema", "sqlObject.search.placeholder": "Cerca in tabelle, viste, procedure", "sqlObject.searchBy": "Cerca per:", + "sqlObject.sizeBytes": "Dimensione (byte)", + "sqlObject.sortBy": "Ordina per:", "sqlObject.tableComment": "Commento tabella", "sqlObject.tableEngine": "Motore tabella", "sqlObject.tableViewProcedureName": "Nome tabella/vista/procedura", @@ -902,6 +992,17 @@ "widget.keys": "Chiavi", "widget.pinned": "Fissate", "widget.tablesViewsFunctions": "Tabelle, viste, funzioni", + "widgets.addNew": "Aggiungi nuovo", + "widgets.administration": "Amministrazione", + "widgets.archive": "Archivio (dati tabellari salvati)", + "widgets.availableExtensions": "Estensioni disponibili", + "widgets.databaseConnections": "Connessioni database", + "widgets.dbgateCloud": "DbGate Cloud", + "widgets.favoritesAndSavedFiles": "Preferiti e file salvati", + "widgets.installedExtensions": "Estensioni installate", "widgets.managePlugins": "Gestisci plugin", + "widgets.premiumPromo": "Promo Premium", + "widgets.queryHistoryAndClosedTabs": "Cronologia query e schede chiuse", + "widgets.selectedCellDataDetailView": "Vista dettagliata dati cella selezionata", "widgets.viewApplicationLogs": "Visualizza log applicazione" -} \ No newline at end of file +} diff --git a/translations/ja.json b/translations/ja.json new file mode 100644 index 000000000..6185aeccb --- /dev/null +++ b/translations/ja.json @@ -0,0 +1,1008 @@ +{ + "app.databaseName": "データベース名", + "app.loading_plugin": "プラグイン {plugin} を読み込み中...", + "app.preparingPlugins": "プラグインを準備中...", + "app.starting": "DbGateを起動中", + "connection.authToken": "認証トークン", + "chart.detect": "チャートを検出", + "chart.open": "チャートを開く", + "clipboard.SQLInsert": "SQL INSERT文", + "clipboard.SQLUpdate": "SQL UPDATE文", + "clipboard.copyCSV": "CSVとしてコピー", + "clipboard.copyJSON": "JSONとしてコピー", + "clipboard.copyJSONLines": "JSON lines/NDJSONとしてコピー", + "clipboard.copyMongoInsert": "Mongo INSERT文としてコピー", + "clipboard.copyOnlyHeadres": "ヘッダーのみコピー", + "clipboard.copySQLInsert": "SQL INSERT文としてコピー", + "clipboard.copySQLUpdate": "SQL UPDATE文としてコピー", + "clipboard.copyWithHeaders": "ヘッダー付きでコピー", + "clipboard.copyWithoutHeaders": "ヘッダーなしでコピー", + "clipboard.copyYAML": "YAMLとしてコピー", + "clipboard.mongoInsert": "Mongo INSERT文", + "clipboard.onlyHeaders": "ヘッダーのみ", + "clipboard.withHeaders": "ヘッダー付き", + "clipboard.withoutHeaders": "ヘッダーなし", + "column.addNew": "新しいカラムを追加", + "column.copyName": "名前をコピー", + "column.dropColumn": "カラムを削除", + "column.fixed": "固定カラム(SQLのような)", + "column.name": "カラム名", + "column.renameColumn": "カラム名を変更", + "column.search": "カラムを検索", + "column.variable": "可変カラム(MongoDBのような)", + "columnEditor.addColumn": "カラム {columnNumber} を追加", + "columnEditor.autoIncrement": "自動増分", + "columnEditor.columnComment": "コメント", + "columnEditor.columnName": "カラム名", + "columnEditor.computedExpression": "計算式", + "columnEditor.defaultValue": "デフォルト値。有効なSQL式を使用してください。例:文字列値の場合は 'Hello World'、空文字列の場合は ''", + "columnEditor.editColumn": "カラムを編集", + "columnEditor.isPrimaryKey": "主キー", + "columnEditor.isSparse": "スパース", + "columnEditor.isUnsigned": "符号なし", + "columnEditor.isZerofill": "ゼロ埋め", + "columnsConstraintEditor.addNewColumn": "新しいカラムを追加", + "columnsConstraintEditor.chooseColumn": "カラムを選択", + "columnsConstraintEditor.selectColumn": "カラムを選択", + "command.about": "について", + "command.about.show": "表示", + "command.about.toolbar": "について", + "command.app.checkForUpdates": "更新を確認", + "command.app.disconnect": "切断", + "command.app.loggedUser": "ログインユーザー", + "command.app.logout": "ログアウト", + "command.application": "アプリケーション", + "command.application.becomeSponsor": "スポンサーになる", + "command.application.documentation": "ドキュメント", + "command.application.maximize": "最大化", + "command.application.minimize": "最小化", + "command.application.openIssue": "問題や機能リクエストを報告", + "command.application.reload": "再読み込み", + "command.application.toggleDevTools": "開発者ツールの切り替え", + "command.application.toggleFullScreen": "全画面表示の切り替え", + "command.application.unsetCurrentDatabase": "現在のデータベースを解除", + "command.application.web": "DbGate web", + "command.application.zoomIn": "拡大", + "command.application.zoomOut": "縮小", + "command.application.zoomReset": "ズームをリセット", + "command.archiveFile": "アーカイブファイル", + "command.archiveFile.save": "保存", + "command.archiveFile.saveAs": "名前を付けて保存", + "command.cloud": "クラウド", + "command.cloud.logout": "ログアウト", + "command.collectionData": "コレクションデータ", + "command.collectionData.collapseAll": "すべて折りたたむ", + "command.collectionData.expandAll": "すべて展開", + "command.collectionData.save": "保存", + "command.commandPalette": "コマンドパレット", + "command.commandPalette.show": "表示", + "command.copy": "コピー", + "command.dataForm": "データフォーム", + "command.dataForm.addToFilter": "フィルターに追加", + "command.dataForm.copyToClipboard": "クリップボードにコピー", + "command.dataForm.filterSelected": "この値でフィルター", + "command.dataForm.goToFirst": "最初", + "command.dataForm.goToLast": "最後", + "command.dataForm.goToNext": "次へ", + "command.dataForm.goToPrevious": "前へ", + "command.dataForm.redo": "やり直す", + "command.dataForm.removeField": "フィールドを削除", + "command.dataForm.revertRowChanges": "行の変更を元に戻す", + "command.dataForm.setNull": "NULLに設定", + "command.dataForm.undo": "元に戻す", + "command.dataGrid": "データグリッド", + "command.dataGrid.export": "エクスポート", + "command.dataGrid.openQuery": "クエリを開く", + "command.dataGrid.reconnect": "再接続", + "command.database": "データベース", + "command.database.changeRecent": "最近使用したものに変更", + "command.database.changeStatus": "ステータスを変更", + "command.database.chat": "データベースチャット", + "command.database.compare": "データベースを比較", + "command.database.databaseSearch": "データベース検索", + "command.database.export": "データベースをエクスポート", + "command.database.search": "検索", + "command.database.switchRecent": "最近使用したデータベースに切り替え", + "command.datagrid": "データグリッド", + "command.datagrid.addJsonDocument": "JSONドキュメントを追加", + "command.datagrid.addNewColumn": "新しいカラムを追加", + "command.datagrid.addNewColumn.toolbar": "新しいカラム", + "command.datagrid.autoRefresh.seconds": "秒", + "command.datagrid.clearFilter": "フィルターをクリア", + "command.datagrid.cloneRows": "行を複製", + "command.datagrid.cloneRows.toolbar": "行を複製", + "command.datagrid.copyToClipboard": "クリップボードにコピー", + "command.datagrid.deleteSelectedRows": "選択した行を削除", + "command.datagrid.deleteSelectedRows.toolbar": "行を削除", + "command.datagrid.editCell": "セルの値を編集", + "command.datagrid.editJsonDocument": "行をJSONドキュメントとして編集", + "command.datagrid.editSelection": "選択範囲をテーブルとして編集", + "command.datagrid.filterSelected": "選択した値でフィルター", + "command.datagrid.findColumn": "カラムを検索", + "command.datagrid.generateSql": "SQLを生成", + "command.datagrid.insertNewRow": "新しい行を挿入", + "command.datagrid.insertNewRow.toolbar": "新しい行", + "command.datagrid.loadCellFromFile": "ファイルからセルを読み込み", + "command.datagrid.openJsonArrayInSheet": "配列をテーブルとして開く", + "command.datagrid.openSelectionInMap": "選択範囲をマップで開く", + "command.datagrid.reconnect": "再接続", + "command.datagrid.redo": "やり直す", + "command.datagrid.removeField": "フィールドを削除", + "command.datagrid.revertAllChanges": "すべての変更を元に戻す", + "command.datagrid.revertAllChanges.toolbar": "すべて元に戻す", + "command.datagrid.revertRowChanges": "行の変更を元に戻す", + "command.datagrid.saveCellToFile": "セルをファイルに保存", + "command.datagrid.sendToDataDeployer": "データデプロイヤーに送信", + "command.datagrid.setAutoRefresh.1": "1秒ごとに更新", + "command.datagrid.setAutoRefresh.10": "10秒ごとに更新", + "command.datagrid.setAutoRefresh.15": "15秒ごとに更新", + "command.datagrid.setAutoRefresh.30": "30秒ごとに更新", + "command.datagrid.setAutoRefresh.5": "5秒ごとに更新", + "command.datagrid.setAutoRefresh.60": "60秒ごとに更新", + "command.datagrid.setNull": "NULLに設定", + "command.datagrid.startAutoRefresh": "自動更新を開始", + "command.datagrid.stopAutoRefresh": "自動更新を停止", + "command.datagrid.switchToJSON": "JSONに切り替え", + "command.datagrid.switchToform": "フォームに切り替え", + "command.datagrid.toggleLeftPanel": "左パネルの切り替え", + "command.datagrid.undo": "元に戻す", + "command.datagrid.viewJsonDocument": "行をJSONドキュメントとして表示", + "command.datagrid.viewJsonValue": "セルをJSONドキュメントとして表示", + "command.datagrid.witchToTable": "テーブルに切り替え", + "command.datgrid.hideColumn": "カラムを非表示", + "command.designer": "デザイナー", + "command.designer.arrange": "配置", + "command.designer.exportDiagram": "ダイアグラムをエクスポート", + "command.designer.remove": "削除", + "command.designer.removeSelectedTables": "選択したテーブルを削除", + "command.diagram": "ダイアグラム", + "command.edit": "編集", + "command.edit.copy": "コピー", + "command.edit.cut": "切り取り", + "command.edit.paste": "貼り付け", + "command.edit.redo": "やり直す", + "command.edit.selectAll": "すべて選択", + "command.edit.undo": "元に戻す", + "command.execute": "実行", + "command.favoriteJsonEditor": "お気に入りJSONエディター", + "command.favoriteJsonEditor.preview": "プレビュー", + "command.favoriteJsonEditor.save": "保存", + "command.file": "ファイル", + "command.file.exit": "終了", + "command.file.import": "データをインポート", + "command.file.open": "開く", + "command.file.openArchive": "DBモデル/アーカイブを開く", + "command.file.quit": "終了", + "command.file.resetLayout": "レイアウトデータと設定をリセット", + "command.file.resetLayoutConfirm": "レイアウトデータを本当にリセットしますか?開いているすべてのタブ、設定、レイアウトデータが失われます。接続と保存されたファイルは保持されます。その後、変更を適用するためにDbGateを再起動してください。", + "command.find": "検索", + "command.folder": "フォルダー", + "command.folder.openData": "データフォルダーを開く", + "command.folder.openLogs": "ログを開く", + "command.internal": "内部", + "command.internal.loadCampaigns": "キャンペーンリストを読み込み", + "command.internal.showCampaigns": "キャンペーンを表示", + "command.jsonl.closePreview": "プレビューを閉じる", + "command.jsonl.preview": "プレビュー", + "command.jsonl.previewNewTab": "新しいタブでプレビュー", + "command.jsonl.save": "保存", + "command.kill": "強制終了", + "command.markdown.preview": "プレビュー", + "command.new": "新規", + "command.new.JSShell": "新しいJavaScriptシェル", + "command.new.application": "アプリケーション", + "command.new.archiveFolder": "アーカイブフォルダー", + "command.new.collection": "コレクション", + "command.new.collectionToolbar": "新しいコレクション/コンテナー", + "command.new.connection": "接続を追加", + "command.new.connectionCloud": "クラウド上の接続", + "command.new.connectionFolder": "接続フォルダー", + "command.new.connectionFolderToolbar": "接続フォルダーを追加", + "command.new.diagram": "ERダイアグラム", + "command.new.duckdbDatabase": "新しいDuckDBデータベース", + "command.new.jsonl": "JSON Lines", + "command.new.markdown": "Markdownページ", + "command.new.modelCompare": "DBを比較", + "command.new.modelTransform": "モデル変換", + "command.new.newApplication": "新しいアプリケーション", + "command.new.newDiagram": "新しいERダイアグラム", + "command.new.newJsonl": "新しいJSON linesファイル", + "command.new.newModelTransform": "新しいモデル変換", + "command.new.newPerspective": "新しいパースペクティブ", + "command.new.newQueryDesign": "新しいクエリデザイン", + "command.new.perspective": "パースペクティブ", + "command.new.query": "クエリ", + "command.new.queryDesign": "クエリデザイン", + "command.new.queryToolbar": "新しいクエリ", + "command.new.shell": "JavaScriptシェル", + "command.new.sqliteDatabase": "新しいSQLiteデータベース", + "command.new.table": "テーブル", + "command.new.tableToolbar": "新しいテーブル", + "command.openQuery": "クエリを開く", + "command.paste": "貼り付け", + "command.query": "クエリ", + "command.query.AiAssistant": "AIアシスタント", + "command.query.autocommitOffSwitch": "自動コミット: OFF", + "command.query.autocommitOnSwitch": "自動コミット: ON", + "command.query.beginTransaction": "トランザクションを開始", + "command.query.commitTransaction": "トランザクションをコミット", + "command.query.commitTransactionToolbar": "コミット", + "command.query.executeCurrent": "現在のものを実行", + "command.query.formatCode": "コードをフォーマット", + "command.query.insertSqlJoin": "SQL JOINを挿入", + "command.query.rollbackTransaction": "トランザクションをロールバック", + "command.query.rollbackTransactionToolbar": "ロールバック", + "command.query.toggleAutoExecute": "自動実行の切り替え", + "command.query.toggleFixedConnection": "固定接続の切り替え", + "command.query.toggleVisibleResultTabs": "結果タブの表示切り替え", + "command.queryData": "データをクエリ", + "command.queryData.stopLoading": "読み込みを停止", + "command.redo": "やり直す", + "command.replace": "置換", + "command.save": "保存", + "command.saveAs": "名前を付けて保存", + "command.saveToDisk": "ディスクに保存", + "command.serverSummary": "サーバー概要", + "command.settings": "設定", + "command.settings.change": "変更", + "command.settings.exportConnections": "接続をエクスポート", + "command.settings.importConnections": "接続をインポート", + "command.settings.shortcuts": "キーボードショートカット", + "command.shell.copyNodeScript": "nodejsスクリプトをコピー", + "command.sidebar": "サイドバー", + "command.sidebar.show": "表示", + "command.sidebar.toggleToolbar": "サイドバーの切り替え", + "command.sql": "SQL", + "command.sql.generator": "SQLジェネレーター", + "command.sqlObject": "SQLオブジェクト", + "command.sqlObject.find": "検索", + "command.tableData": "テーブルデータ", + "command.tableData.save": "保存", + "command.tableEditor": "テーブルエディター", + "command.tableEditor.reset": "変更をリセット", + "command.tableEditor.save": "保存", + "command.tabs": "タブ", + "command.tabs.addToFavorites": "現在のタブをお気に入りに追加", + "command.tabs.changelog": "変更履歴", + "command.tabs.closeAll": "すべてのタブを閉じる", + "command.tabs.closeTab": "タブを閉じる", + "command.tabs.closeTabsButCurrentDb": "現在のDB以外のタブを閉じる", + "command.tabs.closeTabsWithCurrentDb": "現在のDBのタブを閉じる", + "command.tabs.nextTab": "次のタブ", + "command.tabs.previousTab": "前のタブ", + "command.tabs.reopenClosedTab": "閉じたタブを再度開く", + "command.theme": "テーマ", + "command.theme.change": "変更", + "command.theme.changeToolbar": "テーマを変更", + "command.toggleComment": "コメントの切り替え", + "command.toolbar": "ツールバー", + "command.toolbar.hide": "非表示", + "command.toolbar.show": "表示", + "command.undo": "元に戻す", + "command.view": "表示", + "command.view.reset": "表示をリセット", + "command.view.restart": "変更を適用するためにDbGateを再起動(またはWebで再読み込み)してください", + "commandModal.category": "カテゴリー", + "commandModal.configure": "コマンドを設定", + "commandModal.keyboard": "キーボード", + "commandModal.keyboardShortcut": "キーボードショートカット", + "commandModal.name": "名前", + "commandModal.showKeyCombination": "希望するキー組み合わせを表示してENTERを押してください", + "common.addNew": "新規追加", + "common.advanced": "詳細設定", + "common.archive": "アーカイブ (JSONL)", + "common.cancel": "キャンセル", + "common.close": "閉じる", + "common.column": "カラム ", + "common.compare": "データベースを比較", + "common.connection": "接続", + "common.connectionOnCloud": "クラウド上の接続", + "common.connections": "接続", + "common.createNew": "新規作成", + "common.data": "データ", + "common.database": "データベース", + "common.databaseChat": "データベースチャット", + "common.datagrid.deepRefresh": "構造とともに更新", + "common.delete": "削除", + "common.description": "説明", + "common.erDiagram": "ERダイアグラム", + "common.error": "エラー", + "common.execute": "実行", + "common.export": "エクスポート", + "common.exportDatabase": "データベースをエクスポート", + "common.featurePremium": "この機能はDbGate Premiumでのみ利用可能です", + "common.general": "一般", + "common.import": "インポート", + "common.kill": "強制終了", + "common.loadingData": "データを読み込み中", + "common.name": "名前", + "common.notSelectedOptional": "(未選択 - オプション)", + "common.parameters": "パラメーター", + "common.passwordEncrypted": "パスワードは暗号化されています", + "common.perspective": "パースペクティブ", + "common.query": "クエリ", + "common.queryDesigner": "クエリデザイナー", + "common.queryEditor": "SQLクエリエディター", + "common.refresh": "更新", + "common.remove": "削除", + "common.reset": "リセット", + "common.save": "保存", + "common.saveAndNext": "保存して次へ", + "common.saveToArchive": "アーカイブに保存", + "common.schema": "スキーマ", + "common.search": "検索", + "common.searchBy": "検索条件:", + "common.sqlGenerator": "SQLジェネレーター", + "common.table": "テーブル", + "common.testingConnection": "接続テスト中", + "connection.accessKeyId": "アクセスキーID", + "connection.allowedDatabases": "許可されたデータベース、1行に1つ", + "connection.allowedDatabasesRegex": "許可されたデータベースの正規表現", + "connection.askPassword": "保存せず、パスワードを問い合わせる", + "connection.askUser": "保存せず、ログインとパスワードを問い合わせる", + "connection.authentication": "認証", + "connection.autoDetectNatMap": "NATマップを自動検出(Dockerネットワーク内のRedisクラスターに使用)", + "connection.chooseType": "タイプを選択", + "connection.clientLibraryPath": "クライアントライブラリパス", + "connection.closeConfirm": "接続を閉じると {count} 個の開いているタブが閉じます。続けますか?", + "connection.clusterNodes": "クラスターノード", + "connection.color": "色", + "connection.connect": "接続", + "connection.connectionDefinition": "サービスアカウントキーJSON", + "connection.copyToCloudFolder": "クラウドフォルダーにコピー", + "connection.createDatabase": "データベースを作成", + "connection.createNewFolder": "接続フォルダーを作成", + "connection.createNewFolderName": "新しい接続フォルダー名", + "connection.database": "データベース名", + "connection.databaseFile": "データベースファイル", + "connection.databaseFilePath": "データベースファイル(サーバー上のパス)", + "connection.databaseUrl": "データベースURL", + "connection.defaultDatabase": "デフォルトデータベース", + "connection.delete": "削除", + "connection.deleteConfirm": "本当に接続 {name} を削除しますか?", + "connection.disconnect": "切断", + "connection.displayName": "表示名", + "connection.dockerWarning": "Docker内ではlocalhostと1270.0.1は機能しません。代わりにdockerhostを使用してください", + "connection.duplicate": "複製", + "connection.edit": "編集", + "connection.endpointKey": "キー", + "connection.engine": "データベースエンジン", + "connection.engineDriverNotFound": "エンジンドライバー {engine} が見つかりません。インストールされたプラグインを確認し、接続編集ダイアログでエンジンを変更してください", + "connection.fillDetails": "データベース接続詳細を入力", + "connection.isReadOnly": "読み取り専用", + "connection.keySeparator": "キーセパレーター", + "connection.localDataCenter": "ローカルデータセンター", + "connection.new.folder.title": "新しい接続フォルダーを追加", + "connection.new.title": "新しい接続を追加", + "connection.newQuery": "新しいクエリ(サーバー)", + "connection.password": "パスワード", + "connection.passwordMode": "パスワードモード", + "connection.recentUnsaved": "最近使用したものと未保存", + "connection.refresh": "更新", + "connection.refresh.title": "接続リストを更新", + "connection.saveEncrypted": "保存して暗号化", + "connection.saveRaw": "生のまま保存(危険!!)", + "connection.search.placeholder": "接続またはデータベースを検索", + "connection.secretAccessKey": "シークレットアクセスキー", + "connection.selectType": "(接続タイプを選択)", + "connection.server": "サーバー", + "connection.serverSummary": "サーバー概要", + "connection.serviceName": "サービス名", + "connection.singleDatabase": "データベース {defaultDatabase} のみを使用", + "connection.socketPath": "ソケットパス", + "connection.sshTunnel.agentFound": "SSHエージェントが見つかりました", + "connection.sshTunnel.agentNotFound": "SSHエージェントが見つかりません", + "connection.sshTunnel.authMethod.userPassword": "ユーザー名とパスワード", + "connection.sshTunnel.authentication": "SSH認証", + "connection.sshTunnel.keyFilePassphrase": "キーファイルのパスフレーズ", + "connection.sshTunnel.privateKeyFile": "秘密鍵ファイル", + "connection.sshTunnel.privateKeyFilePath": "秘密鍵ファイル(サーバー上のパス)", + "connection.sshTunnel.use": "SSHトンネルを使用", + "connection.ssl.caCert": "CA証明書(オプション)", + "connection.ssl.certificate": "証明書(オプション)", + "connection.ssl.certificateKeyFilePassword": "証明書キーファイルのパスワード(オプション)", + "connection.ssl.keyFile": "キーファイル(オプション)", + "connection.ssl.rejectUnauthorized": "未認証を拒否", + "connection.ssl.use": "SSLを使用", + "connection.trustServerCertificate": "サーバー証明書を信頼", + "connection.type": "接続タイプ", + "connection.useSeparateSchemas": "スキーマを個別に使用(多数の大きなスキーマがある場合に使用)", + "connection.useUrl": "データベースURLを使用", + "connection.user": "ユーザー", + "connection.viewDetails": "詳細を表示", + "connection.windowsDomain": "ドメイン(NTLM認証を使用する場合に指定)", + "dataForm.loadingRowCount": "行数を読み込み中...", + "dataForm.noData": "データがありません", + "dataForm.outOfBounds": "範囲外: {current} / {total}", + "dataForm.rowCount": "行: {current} / {total}", + "dataGrid.chooseValue": "{field} から値を選択", + "dataGrid.codeHighlighting": "コードハイライト:", + "dataGrid.codeHighlighting.none": "なし(生テキスト)", + "dataGrid.columns": "カラム", + "dataGrid.dependentTables": "依存テーブル", + "dataGrid.editCellValue": "セルの値を編集", + "dataGrid.filters": "フィルター", + "dataGrid.formatJson": "JSONをフォーマット", + "dataGrid.formatJson.invalid": "有効なJSONではありません", + "dataGrid.macros": "マクロ", + "dataGrid.multiColumnFilter": "複数カラムフィルター", + "dataGrid.references": "参照", + "dataGrid.referencesTables": "参照テーブル", + "dataGrid.searchReferences": "参照を検索", + "dataGrid.value": "値", + "database.backup": "バックアップ #", + "database.chooseArchiveFolderForDataDeployer": "データデプロイヤー用のアーカイブフォルダーを選択", + "database.closeConfirm": "接続を閉じると {count} 個の開いているタブが閉じます。続けますか?", + "database.compare": "比較", + "database.compareWithCurrentDb": "{name} と比較", + "database.copyDatabaseName": "データベース名をコピー", + "database.createDatabaseBackup": "データベースバックアップを作成", + "database.createNewApplication": "新しいアプリケーションを作成", + "database.dataDeployer": "データデプロイヤー", + "database.databaseChat": "データベースチャット", + "database.databaseProfiler": "データベースプロファイラー", + "database.designPerspectiveQuery": "パースペクティブクエリを設計", + "database.designQuery": "クエリを設計", + "database.diagram": "ダイアグラム #", + "database.disconnect": "切断", + "database.dropAllObjectsConfirm": "これによりスクリプトが生成され、実行後に {name} 内のすべてのオブジェクトが削除されます。続けますか?", + "database.dropConfirm": "本当にデータベース {name} を削除しますか?このデータベースで開いているすべてのセッションが強制的に閉じられます。", + "database.dropDatabase": "データベースを削除", + "database.editApplications": "アプリケーションを編集", + "database.export": "エクスポート", + "database.exportDbModel": "DBモデルをエクスポート", + "database.generateScript": "スクリプトを生成", + "database.import": "インポート", + "database.newCollection": "新しいコレクション/コンテナー", + "database.newQuery": "新しいクエリ", + "database.newTable": "新しいテーブル", + "database.perspective": "パースペクティブ #", + "database.profiler": "プロファイラー", + "database.queryDesigner": "クエリ #", + "database.refreshSchemas": "スキーマを更新", + "database.restore": "復元 #", + "database.restoreDatabaseBackup": "データベースバックアップを復元", + "database.shellDropAllObjects": "シェル: すべてのオブジェクトを削除", + "database.shellRunScript": "シェル: スクリプトを実行", + "database.shellTitle": "シェル #", + "database.showDiagram": "ダイアグラムを表示", + "database.sqlGenerator": "SQLジェネレーター", + "datagrid.closeTabs.close": "タブを閉じる", + "datagrid.closeTabs.header": "タブを閉じることを確認", + "datagrid.closeTabs.modifiedFiles": "次のファイルが変更されています。本当にタブを閉じますか?閉じた後、履歴から再度開くことができます", + "datagrid.columnNameFilter": "カラム名フィルター", + "datagrid.copyAdvanced": "高度なコピー", + "datagrid.macros.calculation": "Calculation", + "datagrid.macros.calculationDescription": "Custom expression. Use row.column_name for accessing column values, value for original value", + "datagrid.macros.changeTextCase": "Change text case", + "datagrid.macros.changeTextCaseDescription": "Uppercase, lowercase and other case functions", + "datagrid.macros.changeTextCaseType": "Type", + "datagrid.macros.currentDate": "Current date", + "datagrid.macros.currentDateDescription": "Gets current date", + "datagrid.macros.dayName": "Day name", + "datagrid.macros.delimiter": "Delimiter", + "datagrid.macros.detail": "Macro detail", + "datagrid.macros.duplicateColumns": "Duplicate columns", + "datagrid.macros.duplicateColumnsDescription": "Duplicate selected columns", + "datagrid.macros.expression": "Expression", + "datagrid.macros.extractDateFields": "Extract date fields", + "datagrid.macros.extractDateFieldsDescription": "Extract year, month, day and other date/time fields from selection and adds it as new columns", + "datagrid.macros.format": "Format", + "datagrid.macros.generateUUID": "Generate UUID", + "datagrid.macros.generateUUIDDescription": "Generate unique identifier", + "datagrid.macros.hourName": "Hour name", + "datagrid.macros.minuteName": "Minute name", + "datagrid.macros.monthName": "Month name", + "datagrid.macros.noParameters": "This macro has no parameters", + "datagrid.macros.padCharacter": "Character", + "datagrid.macros.padLeft": "Pad left", + "datagrid.macros.padLeftDescription": "Returns string of a specified length in which the beginning of the current string is padded with spaces or other character", + "datagrid.macros.padLength": "Length", + "datagrid.macros.padRight": "Pad right", + "datagrid.macros.padRightDescription": "Returns string of a specified length in which the end of the current string is padded with spaces or other character", + "datagrid.macros.postfix": "Postfix", + "datagrid.macros.prefix": "Prefix", + "datagrid.macros.removeDiacritics": "Remove diacritics", + "datagrid.macros.removeDiacriticsDescription": "Removes diacritics from selected cells", + "datagrid.macros.rowIndex": "Row index", + "datagrid.macros.rowIndexDescription": "Index of row from 1 (autoincrement)", + "datagrid.macros.searchReplaceText": "Search & replace text", + "datagrid.macros.searchReplaceTextCaseSensitive": "Case sensitive", + "datagrid.macros.searchReplaceTextDescription": "Search & replace text or regular expression", + "datagrid.macros.searchReplaceTextFind": "Find", + "datagrid.macros.searchReplaceTextIsRegex": "Regular expression", + "datagrid.macros.searchReplaceTextReplaceWith": "Replace with", + "datagrid.macros.secondName": "Second name", + "datagrid.macros.splitColumns": "Split columns", + "datagrid.macros.splitColumnsDescription": "Split selected columns", + "datagrid.macros.textGroup": "Text", + "datagrid.macros.toBoolean": "Convert to boolean", + "datagrid.macros.toBooleanDescription": "Converts to boolean", + "datagrid.macros.toInt": "Convert to integer", + "datagrid.macros.toIntDescription": "Converts to integral number", + "datagrid.macros.toNumber": "Convert to number", + "datagrid.macros.toNumberDescription": "Converts to number", + "datagrid.macros.toString": "Convert to string", + "datagrid.macros.toStringDescription": "Converts to string", + "datagrid.macros.toolsGroup": "Tools", + "datagrid.macros.trim": "Trim", + "datagrid.macros.trimDescription": "Removes leading and trailing whitespace", + "datagrid.macros.version": "Version", + "datagrid.macros.yearName": "Year name", + "datagrid.searchMacros": "Search macros", + "datagrid.setFormat": "Set format: ", + "datagrid.structure": "Structure", + "dbObject.collections": "コレクション/コンテナー", + "dbObject.confirmCloneCollection": "本当に {name} という名前のコレクション/コンテナーのコピーを作成しますか?", + "dbObject.confirmDropCollection": "本当にコレクション {name} を削除しますか?", + "dbObject.copyTableName": "テーブル名をコピー", + "dbObject.createCollection": "コレクション/コンテナーを作成", + "dbObject.createCollectionBackup": "コレクション/コンテナーバックアップを作成", + "dbObject.createTableBackup": "テーブルバックアップを作成", + "dbObject.designPerspectiveQuery": "パースペクティブクエリを設計", + "dbObject.designQuery": "クエリを設計", + "dbObject.diagram": "ダイアグラム #", + "dbObject.disable": "無効化", + "dbObject.dropCollection": "コレクション/コンテナーを削除", + "dbObject.dropEvent": "イベントを削除", + "dbObject.dropProcedure": "プロシージャを削除", + "dbObject.dropTable": "テーブルを削除", + "dbObject.dropTrigger": "トリガーを削除", + "dbObject.dropView": "ビューを削除", + "dbObject.enable": "有効化", + "dbObject.functions": "関数", + "dbObject.matviews": "マテリアライズドビュー", + "dbObject.newCollectionName": "新しいコレクション/コンテナー名", + "dbObject.openData": "データを開く", + "dbObject.openJson": "JSONを開く", + "dbObject.openRawData": "生データを開く", + "dbObject.openStructure": "構造を開く", + "dbObject.procedures": "プロシージャ", + "dbObject.query": "クエリ #", + "dbObject.queryDesigner": "クエリデザイナー", + "dbObject.renameCollection": "コレクション/コンテナー名を変更", + "dbObject.renameProcedure": "プロシージャ名を変更", + "dbObject.renameTable": "テーブル名を変更", + "dbObject.renameView": "ビュー名を変更", + "dbObject.schedulerEvents": "スケジューラーイベント", + "dbObject.showDiagram": "ダイアグラムを表示", + "dbObject.showQuery": "クエリを表示", + "dbObject.showSql": "SQLを表示", + "dbObject.sqlGenerator": "SQLジェネレーター", + "dbObject.sqlTemplate": "SQLテンプレート", + "dbObject.tables": "テーブル", + "dbObject.triggers": "トリガー", + "dbObject.truncateTable": "テーブルをトランケート", + "dbObject.views": "ビュー", + "error.driverNotFound": "無効なデータベース接続、ドライバーが見つかりません", + "error.selectedCloudConnection": "選択された接続はDbGateクラウドからのものです", + "error.selectedNotCloudConnection": "選択された接続はDbGateクラウドからのものではありません", + "export.currentArchive": "現在のアーカイブ", + "export.exportAdvanced": "高度なエクスポート...", + "export.result": "エクスポート結果", + "file.allSupported": "サポートされているすべてのファイル", + "file.diagramFiles": "ダイアグラムファイル", + "file.duckdb": "DuckDBデータベース", + "file.jsonFiles": "JSONファイル", + "file.perspectiveFiles": "パースペクティブファイル", + "file.queryDesignerFiles": "クエリデザイナーファイル", + "file.sqlFiles": "SQLファイル", + "file.sqliteDatabase": "SQLiteデータベース", + "filter.after": "以降...", + "filter.and": "かつ", + "filter.arrayIsEmpty": "配列が空", + "filter.arrayIsNotEmpty": "配列が空ではない", + "filter.before": "以前...", + "filter.beginsWith": "で始まる...", + "filter.between": "の間...", + "filter.clear": "フィルターをクリア", + "filter.contains": "を含む...", + "filter.doesNotBeginWith": "で始まらない...", + "filter.doesNotContain": "を含まない...", + "filter.doesNotEndWith": "で終わらない...", + "filter.doesNotEqual": "等しくない...", + "filter.endsWith": "で終わる...", + "filter.equals": "等しい...", + "filter.fieldDoesNotExist": "フィールドが存在しない", + "filter.fieldExists": "フィールドが存在する", + "filter.greaterThan": "より大きい...", + "filter.greaterThanOrEqualTo": "以上...", + "filter.hasNotEmptyValue": "空でない値を持つ", + "filter.isAfter": "以降", + "filter.isAfterOrEqual": "以降または等しい", + "filter.isBefore": "以前", + "filter.isBeforeOrEqual": "以前または等しい", + "filter.isEmptyOrNull": "空またはNULL", + "filter.isFalse": "偽", + "filter.isFalseOrNull": "偽またはNULL", + "filter.isGreater": "より大きい", + "filter.isGreaterOrEqual": "以上", + "filter.isNotNull": "NULLではない", + "filter.isNull": "NULL", + "filter.isSmaller": "より小さい", + "filter.isSmallerOrEqual": "以下", + "filter.isTrue": "真", + "filter.isTrueOrNull": "真またはNULL", + "filter.lastMonth": "先月", + "filter.lastWeek": "先週", + "filter.lastYear": "昨年", + "filter.lessThan": "より小さい...", + "filter.lessThanOrEqualTo": "以下...", + "filter.modal.beginsWith": "で始まる", + "filter.modal.contains": "を含む", + "filter.modal.doesNotBeginWith": "で始まらない", + "filter.modal.doesNotContain": "を含まない", + "filter.modal.doesNotEndWith": "で終わらない", + "filter.modal.doesNotEqual": "等しくない", + "filter.modal.endsWith": "で終わる", + "filter.modal.equals": "等しい", + "filter.modal.fieldDoesNotExist": "フィールドが存在しない", + "filter.modal.fieldExists": "フィールドが存在する", + "filter.modal.isNotNull": "NULLではない", + "filter.modal.isNull": "NULL", + "filter.modal.sqlCondition": "SQL条件", + "filter.modal.sqlConditionRight": "SQL条件 - 右側のみ", + "filter.multipleValues": "複数の値でフィルター", + "filter.nextMonth": "来月", + "filter.nextWeek": "来週", + "filter.nextYear": "来年", + "filter.or": "または", + "filter.setFilter": "フィルターを設定", + "filter.showRowsWhere": "次の条件の行を表示", + "filter.sqlCondition": "SQL条件 ...", + "filter.sqlConditionRight": "SQL条件 - 右側 ...", + "filter.thisMonth": "今月", + "filter.thisWeek": "今週", + "filter.thisYear": "今年", + "filter.today": "今日", + "filter.tomorrow": "明日", + "filter.yesterday": "昨日", + "foreignKey.baseColumns": "基本カラム", + "foreignKey.refColumns": "参照カラム", + "foreignKey.refTableName": "参照テーブル", + "foreignKeyEditor.addColumn": "カラムを追加", + "foreignKeyEditor.addForeignKey": "外部キーを追加", + "foreignKeyEditor.baseColumn": "基本カラム - ", + "foreignKeyEditor.editForeignKey": "外部キーを編集", + "foreignKeyEditor.onDeleteAction": "削除時の動作", + "foreignKeyEditor.onUpdateAction": "更新時の動作", + "foreignKeyEditor.refColumn": "参照カラム - ", + "foreignKeyEditor.referencedTable": "参照テーブル", + "foreignKeyEditor.tableNotSet": "(テーブルが未設定)", + "importExport.createZipFileInArchive": "アーカイブ内にZIPファイルを作成", + "importExport.exportToZipArchive": "ZIPアーカイブを出力", + "importExport.exportToZipFile": "ZIPファイルにエクスポート", + "importExport.importFromZipArchive": "ZIPアーカイブを入力", + "importExport.importFromZipFile": "ZIPファイルからインポート(アーカイブフォルダー内)", + "importExport.sourceFiles": "ソースファイル", + "importExport.tablesViewsCollections": "テーブル / ビュー / コレクション", + "indexEditor.filteredIndexCondition": "フィルター済みインデックス条件", + "indexEditor.indexName": "インデックス名", + "indexEditor.isUnique": "一意インデックス", + "menu.edit": "編集", + "menu.file": "ファイル", + "menu.help": "ヘルプ", + "menu.tools": "ツール", + "menu.view": "表示", + "newObject.compareDescription": "データベーススキーマを比較", + "newObject.compareDisabled": "現在のデータベースでは比較機能が利用できません", + "newObject.connectionLocal": "ローカルに保存されたデータベース接続", + "newObject.connectionLocalDisabled": "新しい接続を作成する権限がありません", + "newObject.connectionOnCloudDescription": "DbGateクラウドに保存されたデータベース接続", + "newObject.connectionOnCloudDisabled": "DbGateクラウドに接続を作成するにはログインが必要です", + "newObject.databaseChatDescription": "AIを使用してデータベースとチャット", + "newObject.databaseChatDisabled": "現在のデータベースではデータベースチャットが利用できません", + "newObject.erDiagramDescription": "データベース構造を可視化", + "newObject.erDiagramDisabled": "現在のデータベースではER図が利用できません", + "newObject.exportDescription": "CSV、JSON、Excel、または他のDBにエクスポート", + "newObject.exportDisabled": "現在のデータベースではエクスポートが利用できません", + "newObject.perspectiveDescription": "複数のデータベースから複雑なデータを結合", + "newObject.queryDesignerDescription": "SQLクエリをビジュアルに設計", + "newObject.queryDesignerDisabled": "現在のデータベースではクエリデザイナーが利用できません", + "newObject.sqlGeneratorDescription": "データベースオブジェクトのSQLスクリプトを生成", + "newObject.sqlGeneratorDisabled": "現在のデータベースではSQLジェネレーターが利用できません", + "newObject.tableDescription": "現在のデータベースにテーブルを作成", + "newObject.tableDisabled": "現在のデータベースではテーブル作成が利用できません", + "query.limitRows": "{queryRowsLimit}行に制限", + "query.named": ":variable", + "query.noParameters": "(パラメーターなし)", + "query.positional": "? (位置指定)", + "query.unlimitedRows": "無制限", + "query.variable": "#variable", + "schema.add": "新しいスキーマを追加", + "schema.allSchemas": "すべてのスキーマ ({count})", + "schema.createSchema": "スキーマを作成", + "schema.delete": "スキーマを削除", + "schema.resetToDefault": "デフォルトにリセット", + "schema.schemaName": "スキーマ名", + "serverSummaryTab.databases": "データベース", + "serverSummaryTab.errorTitle": "サーバー概要の読み込みエラー", + "serverSummaryTab.loadingMessage": "サーバー詳細を読み込み中", + "serverSummaryTab.processes": "プロセス", + "serverSummaryTab.variables": "変数", + "settings.appearance": "アプリケーションテーマ", + "settings.appearance.afterInstalling": "テーマプラグインをインストールすると(利用可能な拡張機能で\"theme\"を検索)、新しいテーマがここに表示されます。", + "settings.appearance.customSize": "カスタムサイズ", + "settings.appearance.editorTheme": "テーマ", + "settings.appearance.editorTheme.default": "(テーマのデフォルトを使用)", + "settings.appearance.fontFamily": "エディターのフォントファミリー", + "settings.appearance.fontSize": "フォントサイズ", + "settings.appearance.moreThemes": "さらに多くのテーマが次の形式で利用可能", + "settings.appearance.useSystemTheme": "システムテーマを使用", + "settings.behaviour": "動作", + "settings.behaviour.jsonPreviewWrap": "プレビューでJSONを折り返す", + "settings.behaviour.openDetailOnArrows": "キーボードナビゲーションで詳細を開く", + "settings.behaviour.singleClickPreview": "\"テーブル、ビュー、関数\"ビューでファイルをシングルクリックまたは選択すると、プレビューモードで表示され、既存のタブ(プレビュータブ)が再利用されます。これは、テーブルを素早く閲覧している際に、訪れたすべてのテーブルに独自のタブを持たせたくない場合に便利です。テーブルの編集を開始するか、\"テーブル\"ビューからダブルクリックでテーブルを開くと、そのテーブル専用の新しいタブが作成されます。", + "settings.behaviour.useTabPreviewMode": "タブプレビューモードを使用", + "settings.confirmations": "確認", + "settings.confirmations.skipConfirm.collectionDataSave": "コレクションデータ保存時の確認をスキップ (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "テーブルデータ保存時の確認をスキップ (SQL)", + "settings.connection": "接続", + "settings.connection.autoRefresh": "バックグラウンドでデータベースモデルを自動更新", + "settings.connection.autoRefreshInterval": "DB構造の自動再読み込み間隔(秒)", + "settings.connection.showOnlyTabsFromSelectedDatabase": "選択されたデータベースのタブのみ表示", + "settings.connection.sshBindHost": "SSH接続用のローカルホストアドレス", + "settings.dataGrid.alignNumbersRight": "数値を右揃え", + "settings.dataGrid.collectionPageSize": "コレクションページサイズ(MongoDB JSONビュー用、5から1000の間)", + "settings.dataGrid.coloringMode": "行の色分けモード", + "settings.dataGrid.coloringMode.2-primary": "2行ごと、プライマリカラー", + "settings.dataGrid.coloringMode.2-secondary": "2行ごと、セカンダリカラー", + "settings.dataGrid.coloringMode.36": "3行目と6行目ごと", + "settings.dataGrid.coloringMode.none": "なし", + "settings.dataGrid.defaultAutoRefreshInterval": "デフォルトグリッド自動更新間隔(秒)", + "settings.dataGrid.pageSize": "ページサイズ(漸進的読み込みの行数5から50000の間)", + "settings.dataGrid.showAllColumnsWhenSearch": "検索時にすべてのカラムを表示", + "settings.dataGrid.showHintColumns": "外部キーヒントを表示", + "settings.dataGrid.thousandsSeparator": "数値に桁区切りを使用", + "settings.dataGrid.title": "データグリッド", + "settings.defaultActions": "デフォルト動作", + "settings.defaultActions.collectionClick": "NoSQLコレクションクリック", + "settings.defaultActions.connectionClick": "接続クリック", + "settings.defaultActions.connectionClick.connect": "接続", + "settings.defaultActions.connectionClick.none": "何もしない", + "settings.defaultActions.connectionClick.openDetails": "編集 / 詳細を開く", + "settings.defaultActions.databaseClick": "データベースクリック", + "settings.defaultActions.databaseClick.none": "何もしない", + "settings.defaultActions.databaseClick.switch": "データベースを切り替え", + "settings.defaultActions.functionClick": "関数クリック", + "settings.defaultActions.materializedViewClick": "マテリアライズドビュークリック", + "settings.defaultActions.procedureClick": "プロシージャクリック", + "settings.defaultActions.tableClick": "テーブルクリック", + "settings.defaultActions.useLastUsedAction": "前回使用した動作を使用", + "settings.defaultActions.viewClick": "ビュークリック", + "settings.editor.keybinds": "エディターキーバインド", + "settings.editor.wordWrap": "ワードラップを有効化", + "settings.externalTools": "外部ツール", + "settings.general": "一般", + "settings.license": "ライセンス", + "settings.localization": "ローカライゼーション", + "settings.localization.language": "言語", + "settings.localization.reloadWarning": "新しい言語設定を適用するためにアプリケーションが再読み込みされます", + "settings.nativeMenuRestartWarning": "ネイティブメニュー設定はアプリ再起動後に適用されます", + "settings.other": "その他", + "settings.other.ai.allowSendModels": "DBモデルとクエリスニペットをAIサービスに送信することを許可", + "settings.other.autoUpdateApplication": "アプリケーションの自動更新", + "settings.other.autoUpdateApplication.check": "新しいバージョンを確認", + "settings.other.autoUpdateApplication.download": "新しいバージョンを確認してダウンロード", + "settings.other.autoUpdateApplication.skip": "新しいバージョンを確認しない", + "settings.other.externalTools.mysql": "mysql(MySQLデータベースの復元)", + "settings.other.externalTools.mysqlPlugins": "mysqlプラグインのフォルダー(例:認証用)。問題がある場合のみ設定", + "settings.other.externalTools.mysqldump": "mysqldump(MySQLデータベースのバックアップ)", + "settings.other.externalTools.pg_dump": "pg_dump(PostgreSQLデータベースのバックアップ)", + "settings.other.externalTools.psql": "psql(PostgreSQLデータベースの復元)", + "settings.other.gistCreateToken": "エラーgist作成用のAPIトークン", + "settings.other.license": "ライセンス", + "settings.other.licenseKey": "ライセンスキー", + "settings.other.licenseKey.checkForNew": "新しいライセンスキーを確認", + "settings.other.licenseKey.expiration": "ライセンスキーの有効期限:", + "settings.other.licenseKey.invalid": "ライセンスキーが無効です", + "settings.other.licenseKey.valid": "ライセンスキーは有効です", + "settings.other.licenseKey.validTo": "ライセンス有効期限:", + "settings.session": "クエリセッション", + "settings.session.autoClose": "活動がない期間後にクエリセッションを自動的に閉じる", + "settings.session.autoCloseTimeout": "活動がないクエリセッションを閉じるまでの間隔(分)", + "settings.sqlEditor": "SQLエディター", + "settings.sqlEditor.disableExecuteCurrentLine": "現在の行の実行を無効化(現在を実行)", + "settings.sqlEditor.disableSplitByEmptyLine": "空行での分割を無効化", + "settings.sqlEditor.limitRows": "クエリからN行のみ返す", + "settings.sqlEditor.limitRowsPlaceholder": "(行数制限なし)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "コード補完にテーブルエイリアスを表示", + "settings.sqlEditor.sqlCommandsCase": "SQLコマンドの大文字小文字", + "settings.tabGroup.showServerName": "タブグループのタイトルにデータベース名と並んでサーバー名を表示", + "settings.theme": "テーマ", + "settings.title": "設定", + "settings.useNativeWindowTitle": "ネイティブウィンドウタイトルを使用", + "settings.useSystemNativeMenu": "システムネイティブメニューを使用", + "sqlObject.collectionName": "コレクション名", + "sqlObject.columnComment": "カラムコメント", + "sqlObject.columnDataType": "カラムデータ型", + "sqlObject.columnName": "カラム名", + "sqlObject.databaseEmpty": "データベース {database} が空か、構造が読み込まれていません。更新ボタンを押して構造を再読み込みしてください", + "sqlObject.loadingStructure": "データベース構造を読み込み中", + "sqlObject.newCollection": "新しいコレクション/コンテナー", + "sqlObject.schemaName": "スキーマ", + "sqlObject.search.placeholder": "テーブル、ビュー、プロシージャを検索", + "sqlObject.searchBy": "検索条件:", + "sqlObject.tableComment": "テーブルコメント", + "sqlObject.tableEngine": "テーブルエンジン", + "sqlObject.tableViewProcedureName": "テーブル/ビュー/プロシージャ名", + "sqlObject.tablesWithRows": "行があるテーブルのみ", + "sqlObject.viewProcedureTriggerText": "ビュー/プロシージャ/トリガーテキスト", + "sqlObjectList.refreshDatabase": "データベース接続とオブジェクトリストを更新", + "summaryProcesses.actions": "アクション", + "summaryProcesses.client": "クライアント", + "summaryProcesses.connectionId": "接続ID", + "summaryProcesses.killConfirm": "本当にプロセス {processId} を中止しますか?", + "summaryProcesses.killError": "プロセス {processId} の中止中にエラー:{errorMessage}", + "summaryProcesses.killSuccess": "プロセス {processId} を正常に中止しました", + "summaryProcesses.namespace": "名前空間", + "summaryProcesses.operation": "操作", + "summaryProcesses.processId": "プロセスID", + "summaryProcesses.runningTime": "実行時間", + "summaryProcesses.state": "状態", + "summaryProcesses.waitingFor": "待機中", + "summaryVariables.value": "値", + "summaryVariables.variable": "変数", + "tab.administration": "管理", + "tableData.viewColumns": "カラムを表示", + "tableEdit.addConstraintLabel": "{constraintLabel}を追加", + "tableEdit.editConstraintLabel": "{constraintLabel}を編集", + "tableEdit.unique": "一意", + "tableEditor": "テーブルエディター", + "tableEditor.addColumn": "カラムを追加", + "tableEditor.addForeignKey": "外部キーを追加", + "tableEditor.addIndex": "インデックスを追加", + "tableEditor.addPrimaryKey": "主キーを追加", + "tableEditor.addUnique": "一意制約を追加", + "tableEditor.columnComment": "コメント", + "tableEditor.columns": "カラム", + "tableEditor.computedExpression": "計算式", + "tableEditor.constraintName": "制約名", + "tableEditor.copydefinitions": "定義をコピー", + "tableEditor.copynames": "名前をコピー", + "tableEditor.dataType": "データ型", + "tableEditor.defaultValue": "デフォルト値", + "tableEditor.dependencies": "依存関係", + "tableEditor.foreignKeys": "外部キー ({foreignKeyCount})", + "tableEditor.indexes": "インデックス ({indexCount})", + "tableEditor.isPersisted": "永続化", + "tableEditor.isSparse": "疎", + "tableEditor.isUnsigned": "符号なし", + "tableEditor.isZeroFill": "ゼロ埋め", + "tableEditor.no": "NO", + "tableEditor.noConstraintDefined": "{constraintLabel}が定義されていません", + "tableEditor.nocolumnsdefined": "カラムが定義されていません", + "tableEditor.noforeignkeydefined": "外部キーが定義されていません", + "tableEditor.noindexdefined": "インデックスが定義されていません", + "tableEditor.notnull": "NOT NULL", + "tableEditor.nouniquedefined": "一意制約が定義されていません", + "tableEditor.null": "NULL", + "tableEditor.nullability": "NULL許可", + "tableEditor.primaryKey": "主キー", + "tableEditor.remove": "削除", + "tableEditor.tablename": "テーブル名", + "tableEditor.tableproperties": "テーブルプロパティ", + "tableEditor.unique": "一意", + "tableEditor.uniqueConstraints": "一意制約 ({constraintCount})", + "tableEditor.yes": "YES", + "tableStructure.alter": "テーブルを変更", + "tableStructure.create": "テーブルを作成", + "tabsPanel.addToFavorites": "お気に入りに追加", + "tabsPanel.closeAll": "すべて閉じる", + "tabsPanel.closeOthers": "他を閉じる", + "tabsPanel.closeTabsWithDb": "DB {database} のタブを閉じる", + "tabsPanel.closeTabsWithOtherDb": "{database} 以外のDBのタブを閉じる", + "tabsPanel.closeToTheRight": "右側を閉じる", + "tabsPanel.duplicate": "複製", + "tabsPanel.pinTab": "タブを固定", + "tabsPanel.switchDatabase": "データベースを切り替え", + "widget.collectionsContainers": "コレクション/コンテナー", + "widget.databaseContent": "データベースの内容", + "widget.databases": "データベース", + "widget.keys": "キー", + "widget.pinned": "固定済み", + "widget.tablesViewsFunctions": "テーブル、ビュー、関数", + "widgets.managePlugins": "プラグインを管理", + "widgets.viewApplicationLogs": "アプリケーションログを表示", + "cellDataWidget.autodetect": "自動検出 - {autoDetectTitle}", + "cellDataWidget.formatNotSelected": "フォーマットが未選択", + "cellDataWidget.mustSelectOneCell": "1つのセルを選択する必要があります", + "cellDataWidget.noDataSelected": "データが選択されていません", + "cellDataWidget.title": "セルデータビュー", + "columnLine.addReference": "参照を追加", + "columnLine.sortAscending": "昇順でソート", + "columnLine.sortDescending": "降順でソート", + "columnLine.unsort": "ソートを解除", + "common.allFields": "すべての{field}", + "common.newConnection": "新しい接続", + "common.removeAll": "すべて削除", + "common.server": "サーバー", + "designerTable.addReferences": "参照を追加", + "designerTable.changeColor": "色を変更", + "designerTable.defineVirtualForeignKey": "仮想外部キーを定義", + "designerTable.newAlias": "新しいエイリアス", + "designerTable.removeTableAlias": "テーブルエイリアスを削除", + "designerTable.setTableAlias": "テーブルエイリアスを設定", + "files.allSupportedFiles": "サポートされているすべてのファイル", + "files.favorites": "お気に入り", + "files.openFile": "ファイルを開く", + "files.refreshFiles": "ファイルを更新", + "files.savedFiles": "保存されたファイル", + "files.searchSavedFiles": "保存されたファイルを検索", + "files.sqlFiles": "SQLファイル", + "files.teamFiles": "チームファイル", + "files.uploadFile": "ファイルをアップロード", + "history.queryHistory": "クエリ履歴", + "history.recentlyClosedTabs": "最近閉じたタブ", + "history.searchQueryHistory": "クエリ履歴を検索", + "importExport.action": "アクション", + "importExport.addWebUrl": "Web URLを追加", + "importExport.advancedConfiguration": "詳細設定", + "importExport.archiveFolder": "アーカイブフォルダー", + "importExport.columns": "カラム", + "importExport.currentArchive": "現在のアーカイブ", + "importExport.currentDatabase": "現在のDB", + "importExport.dragDropImportedFilesHere": "インポートするファイルをここにドラッグ&ドロップ", + "importExport.generateScript": "スクリプトを生成", + "importExport.mapSourceTablesFiles": "ソーステーブル/ファイルをマッピング", + "importExport.messages": "メッセージ", + "importExport.newArchive": "新しいアーカイブ", + "importExport.outputFiles": "出力ファイル", + "importExport.preview": "プレビュー", + "importExport.processingImportExport": "インポート/エクスポートを処理中...", + "importExport.run": "実行", + "importExport.schedule": "スケジュール", + "importExport.source": "ソース", + "importExport.sourceConfiguration": "ソース設定", + "importExport.startVariableIndex": "変数インデックスの開始値", + "importExport.status": "ステータス", + "importExport.stop": "停止", + "importExport.storageType": "ストレージタイプ", + "importExport.target": "ターゲット", + "importExport.targetConfiguration": "ターゲット設定", + "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": "時刻", + "plugins.searchExtensionsOnWeb": "Webで拡張機能を検索", + "publicCloudWidget.onlyRelevantFilesListed": "接続、プラットフォーム、DbGateエディションに関連するファイルのみが一覧表示されます。まず接続を定義してください。", + "publicCloudWidget.refreshFiles": "ファイルを更新", + "publicCloudWidget.refreshList": "リストを更新", + "publicCloudWidget.searchPublicFiles": "公開ファイルを検索", + "sqlObject.name": "名前", + "sqlObject.rowCount": "行数", + "sqlObject.sizeBytes": "サイズ(バイト)", + "sqlObject.sortBy": "並び替え:", + "widgets.addNew": "新規追加", + "widgets.administration": "管理", + "widgets.archive": "アーカイブ(保存された表形式データ)", + "widgets.availableExtensions": "利用可能な拡張機能", + "widgets.databaseConnections": "データベース接続", + "widgets.dbgateCloud": "DbGateクラウド", + "widgets.favoritesAndSavedFiles": "お気に入りと保存されたファイル", + "widgets.installedExtensions": "インストール済み拡張機能", + "widgets.premiumPromo": "Premiumプロモーション", + "widgets.queryHistoryAndClosedTabs": "クエリ履歴と閉じたタブ", + "widgets.selectedCellDataDetailView": "選択セルデータの詳細ビュー" +} diff --git a/translations/pt.json b/translations/pt.json index a78335ef0..5a8690588 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -3,7 +3,11 @@ "app.loading_plugin": "Carregando plugin {plugin} ...", "app.preparingPlugins": "Preparando plugins ...", "app.starting": "Iniciando DbGate", - "connection.authToken": "Token de autenticação", + "cellDataWidget.autodetect": "Auto detectar - {autoDetectTitle}", + "cellDataWidget.formatNotSelected": "Formato não selecionado", + "cellDataWidget.mustSelectOneCell": "Deve ser selecionada uma célula", + "cellDataWidget.noDataSelected": "Nenhum dado selecionado", + "cellDataWidget.title": "Visualização de dados da célula", "chart.detect": "Detectar gráfico", "chart.open": "Abrir gráfico", "clipboard.SQLInsert": "SQL INSERTs", @@ -41,6 +45,10 @@ "columnEditor.isSparse": "Esparso", "columnEditor.isUnsigned": "Sem sinal", "columnEditor.isZerofill": "Preenchimento com zero", + "columnLine.addReference": "Adicionar referência", + "columnLine.sortAscending": "Ordenar crescente", + "columnLine.sortDescending": "Ordenar decrescente", + "columnLine.unsort": "Remover ordenação", "columnsConstraintEditor.addNewColumn": "Adicionar nova coluna", "columnsConstraintEditor.chooseColumn": "Escolher coluna", "columnsConstraintEditor.selectColumn": "Selecionar coluna", @@ -290,6 +298,7 @@ "commandModal.showKeyCombination": "Mostre a combinação de teclas desejada e pressione ENTER", "common.addNew": "Adicionar novo", "common.advanced": "Avançado", + "common.allFields": "Todos {field}", "common.archive": "Arquivo (JSONL)", "common.cancel": "Cancelar", "common.close": "Fechar", @@ -316,6 +325,7 @@ "common.kill": "Encerrar", "common.loadingData": "Carregando dados", "common.name": "Nome", + "common.newConnection": "Nova conexão", "common.notSelectedOptional": "(não selecionado - opcional)", "common.parameters": "Parâmetros", "common.passwordEncrypted": "Senha está criptografada", @@ -325,6 +335,7 @@ "common.queryEditor": "Editor de consulta SQL", "common.refresh": "Atualizar", "common.remove": "Remover", + "common.removeAll": "Remover tudo", "common.reset": "Resetar", "common.save": "Salvar", "common.saveAndNext": "Salvar e próximo", @@ -332,6 +343,7 @@ "common.schema": "Schema", "common.search": "Pesquisar", "common.searchBy": "Pesquisar por:", + "common.server": "Servidor", "common.sqlGenerator": "Gerador SQL", "common.table": "Tabela", "common.testingConnection": "Testando conexão", @@ -340,6 +352,7 @@ "connection.allowedDatabasesRegex": "Expressão regular de bancos de dados permitidos", "connection.askPassword": "Não salvar, perguntar senha", "connection.askUser": "Não salvar, perguntar login e senha", + "connection.authToken": "Token de autenticação", "connection.authentication": "Autenticação", "connection.autoDetectNatMap": "Auto detectar mapa NAT (use para Redis Cluster em rede Docker)", "connection.chooseType": "Escolher tipo", @@ -574,6 +587,12 @@ "dbObject.triggers": "Gatilhos", "dbObject.truncateTable": "Truncar tabela", "dbObject.views": "Visões", + "designerTable.addReferences": "Adicionar referências", + "designerTable.changeColor": "Alterar cor", + "designerTable.defineVirtualForeignKey": "Definir chave estrangeira virtual", + "designerTable.newAlias": "Novo alias", + "designerTable.removeTableAlias": "Remover alias da tabela", + "designerTable.setTableAlias": "Definir alias da tabela", "error.driverNotFound": "Conexão de banco de dados inválida, driver não encontrado", "error.selectedCloudConnection": "Conexão selecionada é da nuvem DbGate", "error.selectedNotCloudConnection": "Conexão selecionada não é da nuvem DbGate", @@ -588,6 +607,15 @@ "file.queryDesignerFiles": "Arquivos de designer de consulta", "file.sqlFiles": "Arquivos SQL", "file.sqliteDatabase": "Banco de dados SQLite", + "files.allSupportedFiles": "Todos os arquivos suportados", + "files.favorites": "Favoritos", + "files.openFile": "Abrir arquivo", + "files.refreshFiles": "Atualizar arquivos", + "files.savedFiles": "Arquivos salvos", + "files.searchSavedFiles": "Pesquisar arquivos salvos", + "files.sqlFiles": "Arquivos SQL", + "files.teamFiles": "Arquivos de equipe", + "files.uploadFile": "Enviar arquivo", "filter.after": "Depois de...", "filter.and": "E", "filter.arrayIsEmpty": "Array está vazio", @@ -669,16 +697,69 @@ "foreignKeyEditor.refColumn": "Coluna ref - ", "foreignKeyEditor.referencedTable": "Tabela referenciada", "foreignKeyEditor.tableNotSet": "(tabela não definida)", + "history.queryHistory": "Histórico de consultas", + "history.recentlyClosedTabs": "Abas fechadas recentemente", + "history.searchQueryHistory": "Pesquisar histórico de consultas", + "importExport.action": "Ação", + "importExport.addWebUrl": "Adicionar URL da web", + "importExport.advancedConfiguration": "Configuração avançada", + "importExport.archiveFolder": "Pasta de arquivo", + "importExport.columns": "Colunas", "importExport.createZipFileInArchive": "Criar arquivo ZIP no arquivo", + "importExport.currentArchive": "Arquivo atual", + "importExport.currentDatabase": "BD atual", + "importExport.dragDropImportedFilesHere": "Arraste e solte arquivos importados aqui", "importExport.exportToZipArchive": "Arquivo ZIP de saída", "importExport.exportToZipFile": "Exportar para arquivo ZIP", + "importExport.generateScript": "Gerar script", "importExport.importFromZipArchive": "Arquivo ZIP de entrada", "importExport.importFromZipFile": "Importar de arquivo ZIP (na pasta de arquivo)", + "importExport.mapSourceTablesFiles": "Mapear tabelas/arquivos de origem", + "importExport.messages": "Mensagens", + "importExport.newArchive": "Novo arquivo", + "importExport.outputFiles": "Arquivos de saída", + "importExport.preview": "Visualizar", + "importExport.processingImportExport": "Processando importação/exportação ...", + "importExport.run": "Executar", + "importExport.schedule": "Agendar", + "importExport.source": "Origem", + "importExport.sourceConfiguration": "Configuração de origem", "importExport.sourceFiles": "Arquivos de origem", + "importExport.startVariableIndex": "Índice inicial da variável", + "importExport.status": "Status", + "importExport.stop": "Parar", + "importExport.storageType": "Tipo de armazenamento", "importExport.tablesViewsCollections": "Tabelas / visões / coleções", + "importExport.target": "Destino", + "importExport.targetConfiguration": "Configuração de destino", "indexEditor.filteredIndexCondition": "Condição de índice filtrado", "indexEditor.indexName": "Nome do índice", "indexEditor.isUnique": "É índice único", + "logs.autoScroll": "Rolagem automática", + "logs.caller": "Chamador:", + "logs.callerTab": "Chamador", + "logs.chooseDate": "Escolher data", + "logs.codeTab": "Código", + "logs.connectionId": "ID da conexão:", + "logs.connectionTab": "Conexão", + "logs.database": "Banco de dados:", + "logs.databaseTab": "Banco de dados", + "logs.date": "Data:", + "logs.dateTab": "Data", + "logs.details": "Detalhes", + "logs.engine": "Motor:", + "logs.engineTab": "Motor", + "logs.loadingNextRows": "Carregando próximas linhas...", + "logs.message": "Mensagem:", + "logs.messageCode": "Código da mensagem:", + "logs.messageTab": "Mensagem", + "logs.name": "Nome:", + "logs.nameTab": "Nome", + "logs.noDataForSelectedDate": "Nenhum dado para a data selecionada", + "logs.recentLogs": "Logs recentes", + "logs.refresh": "Atualizar", + "logs.time": "Hora:", + "logs.timeTab": "Hora", "menu.edit": "Editar", "menu.file": "Arquivo", "menu.help": "Ajuda", @@ -703,6 +784,11 @@ "newObject.sqlGeneratorDisabled": "Gerador SQL não está disponível para o banco de dados atual", "newObject.tableDescription": "Criar tabela no banco de dados atual", "newObject.tableDisabled": "Criação de tabela não está disponível para o banco de dados atual", + "plugins.searchExtensionsOnWeb": "Pesquisar extensões na web", + "publicCloudWidget.onlyRelevantFilesListed": "Apenas arquivos relevantes para suas conexões, plataforma e edição do DbGate são listados. Defina conexões primeiro.", + "publicCloudWidget.refreshFiles": "Atualizar arquivos", + "publicCloudWidget.refreshList": "Atualizar lista", + "publicCloudWidget.searchPublicFiles": "Pesquisar arquivos públicos", "query.limitRows": "Limitar a {queryRowsLimit} linhas", "query.named": ":variável", "query.noParameters": "(sem parâmetros)", @@ -819,10 +905,14 @@ "sqlObject.columnName": "Nome da coluna", "sqlObject.databaseEmpty": "Banco de dados {database} está vazio ou estrutura não foi carregada, pressione o botão Atualizar para recarregar a estrutura", "sqlObject.loadingStructure": "Carregando estrutura do banco de dados", + "sqlObject.name": "Nome", "sqlObject.newCollection": "Nova coleção/contêiner", + "sqlObject.rowCount": "Contagem de linhas", "sqlObject.schemaName": "Schema", "sqlObject.search.placeholder": "Pesquisar em tabelas, visões, procedimentos", "sqlObject.searchBy": "Pesquisar por:", + "sqlObject.sizeBytes": "Tamanho (bytes)", + "sqlObject.sortBy": "Ordenar por:", "sqlObject.tableComment": "Comentário da tabela", "sqlObject.tableEngine": "Motor da tabela", "sqlObject.tableViewProcedureName": "Nome da tabela/visão/procedimento", @@ -902,6 +992,17 @@ "widget.keys": "Chaves", "widget.pinned": "Fixados", "widget.tablesViewsFunctions": "Tabelas, visões, funções", + "widgets.addNew": "Adicionar novo", + "widgets.administration": "Administração", + "widgets.archive": "Arquivo (dados tabulares salvos)", + "widgets.availableExtensions": "Extensões disponíveis", + "widgets.databaseConnections": "Conexões de banco de dados", + "widgets.dbgateCloud": "DbGate Cloud", + "widgets.favoritesAndSavedFiles": "Favoritos e arquivos salvos", + "widgets.installedExtensions": "Extensões instaladas", "widgets.managePlugins": "Gerenciar plugins", + "widgets.premiumPromo": "Promoção Premium", + "widgets.queryHistoryAndClosedTabs": "Histórico de consultas e abas fechadas", + "widgets.selectedCellDataDetailView": "Visualização detalhada de dados da célula selecionada", "widgets.viewApplicationLogs": "Ver logs da aplicação" -} \ No newline at end of file +} diff --git a/translations/sk.json b/translations/sk.json index a6a668122..a5f14fa6f 100644 --- a/translations/sk.json +++ b/translations/sk.json @@ -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" -} \ No newline at end of file +} diff --git a/translations/zh.json b/translations/zh.json index d930e2e70..af4906b0f 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -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": "查看应用程序日志" -} \ No newline at end of file +} diff --git a/workflow-templates/includes.tpl.yaml b/workflow-templates/includes.tpl.yaml index 378d33bb1..b8e4fb874 100644 --- a/workflow-templates/includes.tpl.yaml +++ b/workflow-templates/includes.tpl.yaml @@ -7,7 +7,7 @@ checkout-and-merge-pro: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: f27a03d4aff5b00a009643df146a9c17bdbf7801 + ref: 8df782559b84d6b59342c9488f3ca340074f35d6 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/workflow-templates/run-tests.yaml b/workflow-templates/run-tests.yaml index 48324e97e..2fd35404d 100644 --- a/workflow-templates/run-tests.yaml +++ b/workflow-templates/run-tests.yaml @@ -49,26 +49,26 @@ jobs: cd packages/tools yarn test:ci - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: integration-tests/result.json - action-name: Integration tests + # - uses: tanmen/jest-reporter@v1 + # if: always() + # with: + # github-token: ${{ secrets.GITHUB_TOKEN }} + # result-file: integration-tests/result.json + # action-name: Integration tests - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: packages/filterparser/result.json - action-name: Filter parser test results + # - uses: tanmen/jest-reporter@v1 + # if: always() + # with: + # github-token: ${{ secrets.GITHUB_TOKEN }} + # result-file: packages/filterparser/result.json + # action-name: Filter parser test results - - uses: tanmen/jest-reporter@v1 - if: always() - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - result-file: packages/datalib/result.json - action-name: Datalib (perspectives) test results + # - uses: tanmen/jest-reporter@v1 + # if: always() + # with: + # github-token: ${{ secrets.GITHUB_TOKEN }} + # result-file: packages/datalib/result.json + # action-name: Datalib (perspectives) test results services: postgres-integr:
DateTimeCodeMessageConnectionDatabaseEngineCallerName{_t('logs.dateTab', { defaultMessage: 'Date' })}{_t('logs.timeTab', { defaultMessage: 'Time' })}{_t('logs.codeTab', { defaultMessage: 'Code' })}{_t('logs.messageTab', { defaultMessage: 'Message' })}{_t('logs.connectionTab', { defaultMessage: 'Connection' })}{_t('logs.databaseTab', { defaultMessage: 'Database' })}{_t('logs.engineTab', { defaultMessage: 'Engine' })}{_t('logs.callerTab', { defaultMessage: 'Caller' })}{_t('logs.nameTab', { defaultMessage: 'Name' })}
No data for selected date{_t('logs.noDataForSelectedDate', { defaultMessage: "No data for selected date" })}
Loading next rows... {_t('logs.loadingNextRows', { defaultMessage: "Loading next rows..." })}