1
1
mirror of https://github.com/Fabio286/antares.git synced 2025-06-05 21:59:22 +02:00

Compare commits

..

19 Commits

Author SHA1 Message Date
d702ce3fa9 chore(release): 0.7.16-beta.1 2023-08-18 12:22:56 +02:00
63544e95da Merge branch 'feat/export-connections' of https://github.com/antares-sql/antares into develop 2023-08-18 12:12:05 +02:00
6df214558f feat: ability to import connections 2023-08-18 12:11:08 +02:00
f5b86e59e7 feat: ability to export connections 2023-08-17 13:48:55 +02:00
27f0068415 Merge pull request #652 from Lawondyss/develop
Add CZ translation and titles for buttons
2023-08-14 12:16:44 +02:00
Ladislav Vondráček
52e42fa1b5 fix: add some missing titles of buttons 2023-08-14 11:50:38 +02:00
Ladislav Vondráček
5b9b539bc7 chore(i18n): add czech translation 2023-08-14 11:47:41 +02:00
832aa75ebe fix(SQLite): improved view body parsing 2023-08-14 10:44:36 +02:00
aba67f3872 refactor(translation): refactor ca-ES to new format 2023-08-14 09:16:40 +02:00
5a1644f023 Merge branches 'develop' and 'master' of https://github.com/antares-sql/antares into develop 2023-08-14 09:07:55 +02:00
e372712556 Merge pull request #651 from antares-sql/all-contributors/add-markusand
docs: add markusand as a contributor for translation
2023-08-14 09:06:55 +02:00
d4727a7d20 Merge pull request #649 from markusand/master
feat: Add support for catalan language
2023-08-14 09:06:42 +02:00
allcontributors[bot]
f2c2f33afa docs: update .all-contributorsrc [skip ci] 2023-08-14 07:06:40 +00:00
allcontributors[bot]
6dc4bdd0c0 docs: update README.md [skip ci] 2023-08-14 07:06:39 +00:00
Marc Vilella
9c6f1a9ea5 feat: Add catalan language 2023-08-13 19:20:26 +02:00
dd264f802e ci: update snapcraft.yaml 2023-08-11 18:12:38 +02:00
fed0e10702 Merge branch 'master' of https://github.com/antares-sql/antares into beta 2023-08-11 17:34:50 +02:00
e7ce4ef6ed Merge branch 'master' of https://github.com/antares-sql/antares 2023-08-11 17:34:30 +02:00
e03f2eef49 ci: update snapcraft.yaml 2023-08-11 17:34:27 +02:00
27 changed files with 1843 additions and 27 deletions

View File

@@ -239,6 +239,15 @@
"contributions": [
"platform"
]
},
{
"login": "markusand",
"name": "Marc Vilella",
"avatar_url": "https://avatars.githubusercontent.com/u/12972543?v=4",
"profile": "https://github.com/markusand",
"contributions": [
"translation"
]
}
],
"contributorsPerLine": 7,

View File

@@ -2,6 +2,21 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.7.16-beta.1](https://github.com/antares-sql/antares/compare/v0.7.16-beta.0...v0.7.16-beta.1) (2023-08-18)
### Features
* ability to export connections ([f5b86e5](https://github.com/antares-sql/antares/commit/f5b86e59e7e41bbbe1555ec8a85ec1f849e8271d))
* ability to import connections ([6df2145](https://github.com/antares-sql/antares/commit/6df214558f8186dd5fbf101505465f4c07c8ad5f))
* Add catalan language ([9c6f1a9](https://github.com/antares-sql/antares/commit/9c6f1a9ea52b4791082bdbae91b764c486684c3b))
### Bug Fixes
* add some missing titles of buttons ([52e42fa](https://github.com/antares-sql/antares/commit/52e42fa1b529512154c0680124c5e425964a5b1a))
* **SQLite:** improved view body parsing ([832aa75](https://github.com/antares-sql/antares/commit/832aa75ebe46776b9c365dde2dd13db3746adcd5))
### [0.7.16-beta.0](https://github.com/antares-sql/antares/compare/v0.7.15...v0.7.16-beta.0) (2023-08-11)

View File

@@ -153,6 +153,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center" valign="top" width="14.28%"><a href="https://github.com/m1khal3v"><img src="https://avatars.githubusercontent.com/u/41085561?v=4?s=100" width="100px;" alt="Anton Mikhalev"/><br /><sub><b>Anton Mikhalev</b></sub></a><br /><a href="#translation-m1khal3v" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://64k.nl/"><img src="https://avatars.githubusercontent.com/u/3864423?v=4?s=100" width="100px;" alt="René"/><br /><sub><b>René</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=64knl" title="Code">💻</a> <a href="#translation-64knl" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zxp19821005"><img src="https://avatars.githubusercontent.com/u/4915850?v=4?s=100" width="100px;" alt="Woodenman"/><br /><sub><b>Woodenman</b></sub></a><br /><a href="#platform-zxp19821005" title="Packaging/porting to new platform">📦</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/markusand"><img src="https://avatars.githubusercontent.com/u/12972543?v=4?s=100" width="100px;" alt="Marc Vilella"/><br /><sub><b>Marc Vilella</b></sub></a><br /><a href="#translation-markusand" title="Translation">🌍</a></td>
</tr>
</tbody>
</table>

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "antares",
"version": "0.7.16-beta.0",
"version": "0.7.16-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "antares",
"version": "0.7.16-beta.0",
"version": "0.7.16-beta.1",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {

View File

@@ -1,7 +1,7 @@
{
"name": "antares",
"productName": "Antares",
"version": "0.7.16-beta.0",
"version": "0.7.16-beta.1",
"description": "A modern, fast and productivity driven SQL client with a focus in UX.",
"license": "MIT",
"repository": "https://github.com/antares-sql/antares.git",

View File

@@ -31,10 +31,10 @@ parts:
fi
# Get the latest releases json
echo "Get GitHub releases..."
wget --quiet https://api.github.com/repos/fabio286/antares/releases/latest -O releases.json
wget --quiet https://api.github.com/repos/fabio286/antares/releases -O releases.json
# Get the version from the tag_name and the download URL.
VERSION=$(jq . releases.json | grep tag_name | cut -d'"' -f4 | sed s'/release-//')
DEB_URL=$(cat releases.json | jq -r ".assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
VERSION=$(jq . releases.json | grep tag_name | head -1 | cut -d'"' -f4 | sed s'/release-//')
DEB_URL=$(cat releases.json | jq -r ".[0].assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
DEB=$(basename "${DEB_URL}")
echo "Downloading ${DEB_URL}..."
wget --quiet "${DEB_URL}" -O "${SNAPCRAFT_PART_INSTALL}/${DEB}"
@@ -79,7 +79,7 @@ parts:
- libdb5.3
- libdbus-1-3
- libexpat1
- libffi7
- libffi8
- libgcc-s1
- libgcrypt20
- libglib2.0-0
@@ -87,9 +87,9 @@ parts:
- libgnutls30
- libgpg-error0
- libgssapi-krb5-2
- libhogweed5
- libhogweed6
- libidn2-0
- libjson-c4
- libjson-c5
- libk5crypto3
- libkeyutils1
- libkrb5-3
@@ -97,12 +97,12 @@ parts:
- liblz4-1
- liblzma5
- libmount1
- libnettle7
- libnettle8
- libp11-kit0
- libpcre2-8-0
- libselinux1
- libsqlite3-0
- libssl1.1
- libssl3
- libstdc++6
- libsystemd0
- libtasn1-6

View File

@@ -0,0 +1,31 @@
import * as crypto from 'crypto';
const algorithm = 'aes-256-gcm';
function encrypt (text: string, password: string) {
const iv = crypto.randomBytes(16);
const key = crypto.scryptSync(password, 'antares', 32);
const cipher = crypto.createCipheriv(algorithm, key, iv);
const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
const authTag = cipher.getAuthTag();
return {
iv: iv.toString('hex'),
authTag: authTag.toString('hex'),
content: encrypted.toString('hex')
};
}
function decrypt (hash: { iv: string; content: string; authTag: string }, password: string) {
const key = crypto.scryptSync(password, 'antares', 32);
const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(hash.iv, 'hex'));
decipher.setAuthTag(Buffer.from(hash.authTag, 'hex'));
const decrpyted = decipher.update(hash.content, 'hex', 'utf8') + decipher.final('utf8');
return decrpyted;
}
export {
encrypt,
decrypt
};

View File

@@ -425,7 +425,7 @@ export class SQLiteClient extends AntaresCore {
return results.rows.map(row => {
return {
sql: row.sql.match(/(?<=AS ).*?$/gs)[0],
sql: row.sql.match(/(?<=(AS|as)( |\n)).*?$/gs)[0],
name: view
};
})[0];

View File

@@ -16,6 +16,7 @@
:id="`id_${id}`"
class="file-uploader-input"
type="file"
:accept="accept"
@change="$emit('change', $event)"
>
</form>
@@ -33,6 +34,10 @@ defineProps({
default: 'Browse',
type: String
},
accept: {
default: '',
type: String
},
modelValue: {
default: '',
type: String

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6">
<div class="d-flex">
<i class="mdi mdi-24px mdi-brush-variant mr-1" />
<span class="cut-text">{{ t('connection.editConnectionAppearance') }}</span>
<span class="cut-text">{{ t('application.editConnectionAppearance') }}</span>
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />

View File

@@ -26,7 +26,7 @@
type="text"
required
readonly
:placeholder="t('database.schemaName')"
@click.prevent="openPathDialog"
>
<button
type="button"
@@ -251,7 +251,7 @@
</div>
</div>
<div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal">
<button class="btn btn-link mr-2" @click.stop="closeModal">
{{ t('general.close') }}
</button>
<button

View File

@@ -37,6 +37,13 @@
>
<a class="tab-link">{{ t('application.shortcuts') }}</a>
</li>
<li
class="tab-item c-hand"
:class="{'active': selectedTab === 'data'}"
@click="selectTab('data')"
>
<a class="tab-link">{{ t('application.data') }}</a>
</li>
<li
v-if="updateStatus !== 'disabled'"
class="tab-item c-hand"
@@ -366,6 +373,9 @@
<div v-show="selectedTab === 'shortcuts'" class="panel-body py-4">
<ModalSettingsShortcuts />
</div>
<div v-show="selectedTab === 'data'" class="panel-body py-4">
<ModalSettingsData />
</div>
<div v-show="selectedTab === 'update'" class="panel-body py-4">
<ModalSettingsUpdate />
</div>
@@ -411,6 +421,7 @@ import { localesNames } from '@/i18n/supported-locales';
import ModalSettingsUpdate from '@/components/ModalSettingsUpdate.vue';
import ModalSettingsChangelog from '@/components/ModalSettingsChangelog.vue';
import ModalSettingsShortcuts from '@/components/ModalSettingsShortcuts.vue';
import ModalSettingsData from '@/components/ModalSettingsData.vue';
import BaseTextEditor from '@/components/BaseTextEditor.vue';
import BaseSelect from '@/components/BaseSelect.vue';
import { AvailableLocale } from '@/i18n';
@@ -648,10 +659,14 @@ onBeforeUnmount(() => {
.modal-body {
overflow: hidden;
.tab-link {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
.tab-item {
max-width: 20%;
.tab-link {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.panel-body {

View File

@@ -0,0 +1,60 @@
<template>
<div class="container">
<div class="columns">
<div class="column col-12 h6 text-uppercase mb-2">
{{ t('application.exportData') }}
</div>
<div class="column col-12">
{{ t('application.exportDataExplanation') }}
</div>
<div class="column col-12 text-right">
<button
class="btn btn-primary d-inline-flex"
@click="isExportModal=true"
>
<i class="mdi mdi-tray-arrow-up mdi-24px pr-2" />
<span>{{ t('application.exportData') }}</span>
</button>
</div>
</div>
<div class="columns mt-4 mb-2">
<div class="column col-12 h6 text-uppercase mb-2 mt-4">
{{ t('application.importData') }}
</div>
<div class="column col-12">
{{ t('application.importDataExplanation') }}
</div>
<div class="column col-12 text-right">
<button
class="btn btn-dark d-inline-flex ml-auto"
@click="isImportModal=true"
>
<i class="mdi mdi-tray-arrow-down mdi-24px pr-2" />
<span>{{ t('application.importData') }}</span>
</button>
</div>
</div>
<ModalSettingsDataExport
v-if="isExportModal"
@close="isExportModal = false"
/>
<ModalSettingsDataImport
v-if="isImportModal"
@close="isImportModal = false"
/>
</div>
</template>
<script setup lang="ts">
// import { useApplicationStore } from '@/stores/application';
import ModalSettingsDataExport from '@/components/ModalSettingsDataExport.vue';
import ModalSettingsDataImport from '@/components/ModalSettingsDataImport.vue';
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const isExportModal = ref(false);
const isImportModal = ref(false);
</script>

View File

@@ -0,0 +1,331 @@
<template>
<Teleport to="#window-content">
<div class="modal active">
<a class="modal-overlay" @click.stop="closeModal" />
<div ref="trapRef" class="modal-container p-0">
<div class="modal-header pl-2">
<div class="modal-title h6">
<div class="d-flex">
<i class="mdi mdi-24px mdi-tray-arrow-up mr-1" /> {{ t('application.exportData') }}
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="columns export-options">
<div class="column col-8 left">
<div class="workspace-query-results" :style="'min-height: 300px;'">
<div ref="table" class="table table-hover">
<div class="thead">
<div class="tr text-center">
<div class="th no-border" :style="'width:50%'" />
<div class="th no-border" />
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllConnections()"
>
<input
type="checkbox"
:indeterminate="includeConnectionStatus === 2"
:checked="!!includeConnectionStatus"
>
<i class="form-icon" />
</label>
</div>
</div>
<div class="tr">
<div class="th">
<div class="table-column-title">
<span>{{ t('connection.connectionName') }}</span>
</div>
</div>
<div class="th">
<div class="table-column-title">
<span>{{ t('connection.client') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ t('general.include') }}</span>
</div>
</div>
</div>
</div>
<div class="tbody">
<div
v-for="(item, i) in connections"
:key="i"
class="tr"
>
<div class="td">
{{ getConnectionName(item.uid) }}
</div>
<div class="td">
{{ item.client }}
</div>
<div class="td text-center">
<label class="form-checkbox m-0 px-2 form-inline">
<input v-model="connectionToggles[item.uid]" type="checkbox">
<i class="form-icon" />
</label>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="column col-4">
<h5 class="h5">
{{ t('general.options') }}
</h5>
<label class="form-checkbox">
<input v-model="options.includes.passwords" type="checkbox">
<i class="form-icon" />
{{ t(`application.includeConnectionPasswords`) }}
</label>
<label class="form-checkbox">
<input v-model="options.includes.folders" type="checkbox">
<i class="form-icon" />
{{ t(`application.includeFolders`) }}
</label>
<div class="h6 mt-4 mb-2">
{{ t('application.encryptionPassword') }}
</div>
<fieldset class="form-group" :class="{'has-error': isPasswordError}">
<div class="input-group">
<input
ref="passkey"
v-model="options.passkey"
:type="isPasswordVisible ? 'text' : 'password'"
class="form-input"
:placeholder="t('application.required')"
>
<button
type="button"
class="btn btn-link input-group-addon"
@click="isPasswordVisible = !isPasswordVisible"
>
<i v-if="isPasswordVisible" class="mdi mdi-eye px-1" />
<i v-else class="mdi mdi-eye-off px-1" />
</button>
</div>
<span v-if="isPasswordError" class="form-input-hint">
{{ t('application.encryptionPasswordError') }}
</span>
</fieldset>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-link mr-2" @click.stop="closeModal">
{{ t('general.close') }}
</button>
<button
class="btn btn-primary mr-2"
autofocus
@click.prevent="exportData()"
>
{{ t('database.export') }}
</button>
</div>
</div>
</div>
</Teleport>
</template>
<script setup lang="ts">
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
import * as moment from 'moment';
import { useI18n } from 'vue-i18n';
import { useFocusTrap } from '@/composables/useFocusTrap';
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
import { unproxify } from '@/libs/unproxify';
import { uidGen } from 'common/libs/uidGen';
import { storeToRefs } from 'pinia';
import { encrypt } from 'common/libs/encrypter';
import { ConnectionParams } from 'common/interfaces/antares';
const { t } = useI18n();
const emit = defineEmits(['close']);
const { trapRef } = useFocusTrap();
const { getConnectionName } = useConnectionsStore();
const { connectionsOrder, connections } = storeToRefs(useConnectionsStore());
const localConnections = unproxify<ConnectionParams[]>(connections.value);
const localConnectionsOrder = unproxify<SidebarElement[]>(connectionsOrder.value);
const isPasswordVisible = ref(false);
const isPasswordError = ref(false);
const connectionToggles: Ref<{[k:string]: boolean}> = ref({});
const options = ref({
passkey: '',
includes: {
passwords: true,
folders: true
}
});
const filename = computed(() => {
const date = moment().format('YYYY-MM-DD');
return `backup_${date}`;
});
const includeConnectionStatus = computed(() => {
if (Object.values(connectionToggles.value).every(item => item)) return 1;
else if (Object.values(connectionToggles.value).some(item => item)) return 2;
else return 0;
});
const exportData = () => {
if (options.value.passkey.length < 8)
isPasswordError.value = true;
else {
isPasswordError.value = false;
const connectionsToInclude: string[] = [];
const connectionsUidMap = new Map<string, string>();
for (const cUid in connectionToggles.value)
if (connectionToggles.value[cUid]) connectionsToInclude.push(cUid);
let filteredConnections = unproxify<typeof localConnections>(localConnections.filter(conn => connectionsToInclude.includes(conn.uid)));
filteredConnections = filteredConnections.map(c => {
const newUid = uidGen('C');
connectionsUidMap.set(c.uid, newUid);
c.uid = newUid;
return c;
});
if (!options.value.includes.passwords) { // Remove passwords and set ask:true
filteredConnections.map(c => {
if (c.password) {
c.password = '';
c.ask = true;
}
return c;
});
}
let filteredOrders = [];
for (const [oldVal, newVal] of connectionsUidMap) {
const connOrder = unproxify(localConnectionsOrder.find(c => c.uid === oldVal));
connOrder.uid = newVal;
filteredOrders.push(connOrder);
}
if (options.value.includes.folders) { // Includes folders
const oldConnUids = Array.from(connectionsUidMap.keys());
const newConnUids = Array.from(connectionsUidMap.values());
const foldersToInclude = unproxify(localConnectionsOrder).filter(f => (
f.isFolder && oldConnUids.some(uid => f.connections.includes(uid))
)).map(f => {
f.uid = uidGen('F');
f.connections = f.connections
.map(fc => connectionsUidMap.get(fc))
.filter(fc => newConnUids.includes(fc));
return f;
});
filteredOrders = [...filteredOrders, ...foldersToInclude];
}
const exportObj = encrypt(JSON.stringify({
connections: filteredConnections,
connectionsOrder: filteredOrders
}), options.value.passkey);
// console.log(exportObj, JSON.parse(decrypt(exportObj, options.value.passkey)));
const blobContent = Buffer.from(JSON.stringify(exportObj), 'utf-8').toString('hex');
const file = new Blob([blobContent], { type: 'application/octet-stream' });
const downloadLink = document.createElement('a');
downloadLink.download = `${filename.value}.antares`;
downloadLink.href = window.URL.createObjectURL(file);
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
downloadLink.click();
downloadLink.remove();
closeModal();
}
};
const closeModal = () => {
emit('close');
};
const onKey = (e: KeyboardEvent) => {
e.stopPropagation();
if (e.key === 'Escape')
closeModal();
};
const toggleAllConnections = () => {
if (includeConnectionStatus.value !== 1) {
connectionToggles.value = localConnections.reduce((acc, curr) => {
acc[curr.uid] = true;
return acc;
}, {} as {[k:string]: boolean});
}
else {
connectionToggles.value = localConnections.reduce((acc, curr) => {
acc[curr.uid] = false;
return acc;
}, {} as {[k:string]: boolean});
}
};
connectionToggles.value = localConnections.reduce((acc, curr) => {
acc[curr.uid] = true;
return acc;
}, {} as {[k:string]: boolean});
window.addEventListener('keydown', onKey);
onBeforeUnmount(() => {
window.removeEventListener('keydown', onKey);
});
</script>
<style lang="scss" scoped>
.export-options {
flex: 1;
overflow: hidden;
.left {
display: flex;
flex-direction: column;
flex: 1;
}
}
.workspace-query-results {
flex: 1 0 1px;
.table {
width: 100% !important;
}
.form-checkbox {
min-height: 0.8rem;
padding: 0;
.form-icon {
top: 0.1rem;
}
}
}
.modal {
.modal-container {
max-width: 800px;
}
.modal-body {
max-height: 60vh;
display: flex;
flex-direction: column;
}
}
</style>

View File

@@ -0,0 +1,263 @@
<template>
<Teleport to="#window-content">
<div class="modal modal-sm active">
<a class="modal-overlay" @click.stop="closeModal" />
<div ref="trapRef" class="modal-container p-0">
<div class="modal-header pl-2">
<div class="modal-title h6">
<div class="d-flex">
<i class="mdi mdi-24px mdi-tray-arrow-down mr-1" /> {{ t('application.importData') }}
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="mb-2">
<div class="h6 mb-2">
{{ t('application.choseFile') }}
</div>
<BaseUploadInput
:model-value="filePath"
:message="t('general.browse')"
accept=".antares"
@clear="filePath = ''"
@change="filesChange($event)"
/>
</div>
<div class="mb-2">
<div class="h6 mb-2">
{{ t('application.password') }}
</div>
<fieldset class="form-group" :class="{'has-error': isPasswordError}">
<div class="input-group">
<input
ref="passkey"
v-model="options.passkey"
:type="isPasswordVisible ? 'text' : 'password'"
class="form-input"
:placeholder="t('application.required')"
>
<button
type="button"
class="btn btn-link input-group-addon"
@click="isPasswordVisible = !isPasswordVisible"
>
<i v-if="isPasswordVisible" class="mdi mdi-eye px-1" />
<i v-else class="mdi mdi-eye-off px-1" />
</button>
</div>
<span v-if="isPasswordError" class="form-input-hint">
{{ t('application.encryptionPasswordError') }}
</span>
</fieldset>
</div>
<div class="mb-2">
<label class="form-checkbox">
<input v-model="options.ignoreDuplicates" type="checkbox">
<i class="form-icon" />
{{ t(`application.ignoreDuplicates`) }}
</label>
</div>
</div>
<div class="modal-footer">
<button
class="btn btn-link mr-2"
@click.stop="closeModal"
>
{{ t('general.close') }}
</button>
<button
class="btn btn-primary mr-2"
:disabled="!filePath"
@click.prevent="importData()"
>
{{ t('database.import') }}
</button>
</div>
</div>
</div>
</Teleport>
</template>
<script setup lang="ts">
import { onBeforeUnmount, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import BaseUploadInput from '@/components/BaseUploadInput.vue';
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
import { unproxify } from '@/libs/unproxify';
import { storeToRefs } from 'pinia';
import { decrypt } from 'common/libs/encrypter';
import { useNotificationsStore } from '@/stores/notifications';
import { ConnectionParams } from 'common/interfaces/antares';
const { t } = useI18n();
const emit = defineEmits(['close']);
const { addNotification } = useNotificationsStore();
const connectionsStore = useConnectionsStore();
const { importConnections } = connectionsStore;
const { connections } = storeToRefs(connectionsStore);
const filePath = ref('');
const fileContent = ref(null);
const isPasswordVisible = ref(false);
const isPasswordError = ref(false);
const options = ref({
passkey: '',
ignoreDuplicates: true
});
const closeModal = () => {
emit('close');
};
const filesChange = ({ target } : {target: HTMLInputElement }) => {
const { files } = target;
if (!files.length) return;
const reader = new FileReader();
reader.readAsText(files[0]);
reader.onload = () => {
fileContent.value = reader.result;
filePath.value = files[0].path;
};
};
const importData = () => {
if (options.value.passkey.length < 8)
isPasswordError.value = true;
else {
try {
const hash = JSON.parse(Buffer.from(fileContent.value, 'hex').toString('utf-8'));
try {
const importObj: {
connections: ConnectionParams[];
connectionsOrder: SidebarElement[];
} = JSON.parse(decrypt(hash, options.value.passkey));
if (options.value.ignoreDuplicates) {
const actualConnections = unproxify(connections.value).map(c => {
delete c.uid;
delete c.name;
delete c.password;
delete c.ask;
delete c.key;
delete c.cert;
delete c.ca;
delete c.sshKey;
return JSON.stringify(c);
});
const incomingConnections = unproxify<ConnectionParams[]>(importObj.connections).map(c => {
const uid = c.uid;
delete c.uid;
delete c.name;
delete c.password;
delete c.ask;
delete c.key;
delete c.cert;
delete c.ca;
delete c.sshKey;
return { uid, jsonString: JSON.stringify(c) };
});
const newConnectionsUid = incomingConnections
.filter(c => !actualConnections.includes(c.jsonString))
.reduce((acc, cur) => {
acc.push(cur.uid);
return acc;
}, [] as string[]);
importObj.connections = importObj.connections.filter(c => newConnectionsUid.includes(c.uid));
importObj.connectionsOrder = importObj.connectionsOrder
.filter(c => newConnectionsUid
.includes(c.uid) ||
(c.isFolder && c.connections.every(c => newConnectionsUid.includes(c))));
}
importConnections(importObj);
addNotification({
status: 'success',
message: t('application.dataImportSuccess')
});
closeModal();
}
catch (error) {
addNotification({
status: 'error',
message: t('application.wrongImportPassword')
});
}
}
catch (error) {
addNotification({
status: 'error',
message: t('application.wrongFileFormat')
});
}
}
};
const onKey = (e: KeyboardEvent) => {
e.stopPropagation();
if (e.key === 'Escape')
closeModal();
};
window.addEventListener('keydown', onKey);
onBeforeUnmount(() => {
window.removeEventListener('keydown', onKey);
});
</script>
<style lang="scss" scoped>
.export-options {
flex: 1;
overflow: hidden;
.left {
display: flex;
flex-direction: column;
flex: 1;
}
}
.workspace-query-results {
flex: 1 0 1px;
.table {
width: 100% !important;
}
.form-checkbox {
min-height: 0.8rem;
padding: 0;
.form-icon {
top: 0.1rem;
}
}
}
.modal {
.modal-body {
max-height: 60vh;
display: flex;
flex-direction: column;
}
}
</style>

View File

@@ -45,6 +45,7 @@
<button
class="btn btn-dark btn-sm"
:disabled="isSaving || !localFields.length"
:title="t('database.manageForeignKeys')"
@click="showForeignModal"
>
<i class="mdi mdi-24px mdi-key-link mr-1" />

View File

@@ -45,6 +45,7 @@
<button
class="btn btn-dark btn-sm mr-0"
:disabled="isSaving"
:title="t('database.manageIndexes')"
@click="showForeignModal"
>
<i class="mdi mdi-24px mdi-key-link mr-1" />

522
src/renderer/i18n/ca-ES.ts Normal file
View File

@@ -0,0 +1,522 @@
export const caES = {
general: {
edit: 'Editar',
save: 'Desar',
close: 'Tancar',
delete: 'Esborrar',
confirm: 'Confirmar',
cancel: 'Cancel·lar',
send: 'Enviar',
refresh: 'Actualitzar',
autoRefresh: 'Actualització automàtica',
version: 'Versió',
donate: 'Donar',
run: 'Executar',
results: 'Resultats',
size: 'Mida',
mimeType: 'Tipus MIME',
download: 'Descarregar',
add: 'Afegir',
data: 'Dades',
properties: 'Propietats',
insert: 'Inserir',
name: 'Nom',
clear: 'Netejar',
seconds: 'Segons',
options: 'Opcions',
discard: 'Descartar',
stay: 'Quedar-se',
author: 'Autor',
upload: 'Pujar',
browse: 'Navegar',
content: 'Contingut',
cut: 'Tallar',
copy: 'Copiar',
paste: 'Enganxar',
tools: 'Eines',
format: 'Format',
all: 'Tot',
duplicate: 'Duplicar',
new: 'Nou',
history: 'Històric',
select: 'Seleccionar',
filter: 'Filtre',
change: 'Canviar',
includes: 'Inclou',
completed: 'Completat',
aborted: 'Avortat',
disabled: 'Deshabilitat',
enable: 'Habilitar',
disable: 'Deshabilitar',
contributors: 'Contribuïdors',
pin: 'Fixar',
unpin: 'Desfixar',
folder: 'Carpeta | Carpetes',
none: 'Cap',
singleQuote: 'Cometa simple',
doubleQuote: 'Cometa doble',
deleteConfirm: 'Confirmes la cancel·lació de',
uploadFile: 'Puja fitxer',
manualValue: 'Valor manual',
selectAll: 'Selecciona tot',
pageNumber: 'Número de pàgina',
directoryPath: 'Ruta del directori',
actionSuccessful: '{action} realitzat amb èxit',
outputFormat: 'Format de sortida',
singleFile: 'Arxiu {ext} únic',
zipCompressedFile: 'Arxiu {ext} comprimit en ZIP'
},
connection: {
connectionName: 'Nom de la connexió',
client: 'Client',
hostName: 'Nom de l\'amfitrió',
port: 'Port',
user: 'Usuari',
password: 'Contrasenya',
credentials: 'Credencials',
connect: 'Connectar',
connected: 'Connectat',
disconnect: 'Desconnectar',
disconnected: 'Desconnectat',
ssl: 'SSL',
privateKey: 'Clau privada',
certificate: 'Certificat',
caCertificate: 'Certificat CA',
ciphers: 'Xifrats',
sshTunnel: 'Túnel SSH',
passphrase: 'Frase de contrasenya',
connectionString: 'Cadena de connexió',
addConnection: 'Afegeix connexió',
createConnection: 'Crea connexió',
createNewConnection: 'Crea una nova connexió',
askCredentials: 'Demana credencials',
testConnection: 'Prova la connexió',
editConnection: 'Edita la connexió',
deleteConnection: 'Esborra la connexió',
connectionSuccessfullyMade: 'Connexió realitzada amb èxit!',
enableSsl: 'Activa SSL',
enableSsh: 'Activa SSH',
readOnlyMode: 'Mode de lectura',
untrustedConnection: 'Connexió no confiable',
allConnections: 'Totes les connexions',
searchForConnections: 'Cerca connexions'
},
database: {
schema: 'Esquema',
type: 'Tipus',
foreignKeys: 'Claus foranes',
length: 'Longitud',
unsigned: 'Sense signe',
default: 'Per defecte',
comment: 'Comentari',
collation: 'Ordenació',
key: 'Clau | Claus',
order: 'Ordre',
expression: 'Expressió',
autoIncrement: 'Autoincrement',
engine: 'Motor',
field: 'Camp | Camps',
approximately: 'Aproximadament',
total: 'Total',
table: 'Taula',
view: 'Vista',
indexes: 'Índexs',
definer: 'Definidor',
algorithm: 'Algorisme',
trigger: 'Desencadenador | Desencadenadors',
storedRoutine: 'Rutina emmagatzemada | Rutines emmagatzemades',
scheduler: 'Planificador | Planificadors',
event: 'Esdeveniment',
parameters: 'Paràmetres',
function: 'Funció | Funcions',
deterministic: 'Determinista',
context: 'Context',
export: 'Exportar',
import: 'Importar',
returns: 'Retorna',
timing: 'Temporització',
state: 'Estat',
execution: 'Execució',
starts: 'Comença',
ends: 'Acaba',
variables: 'Variables',
processes: 'Processos',
database: 'Base de dades',
array: 'Matriu',
structure: 'Estructura',
row: 'Fila | Files',
cell: 'Cel·la | Cel·les',
triggerFunction: 'Funció de desencadenador | Funcions de desencadenador',
routine: 'Rutina',
commit: 'Validar',
rollback: 'Desfer',
resultsTable: 'Taula de resultats',
ddl: 'DDL',
drop: 'Descartar',
unableEditFieldWithoutPrimary: 'No es pot editar un camp sense una clau primària en el conjunt de resultats',
editCell: 'Edita la cel·la',
deleteRows: 'Esborra fila | Esborra {count} files',
confirmToDeleteRows: 'Confirmes esborrar una fila? | Confirmes esborrar {count} files?',
addNewRow: 'Afegeix una nova fila',
numberOfInserts: 'Nombre d\'insercions',
affectedRows: 'Files afectades',
createNewDatabase: 'Crea una nova base de dades',
databaseName: 'Nom de la base de dades',
serverDefault: 'Per defecte del servidor',
deleteDatabase: 'Esborra la base de dades',
editDatabase: 'Edita la base de dades',
clearChanges: 'Neteja els canvis',
addNewField: 'Afegeix un nou camp',
manageIndexes: 'Gestiona els índexs',
manageForeignKeys: 'Gestiona les claus foranes',
allowNull: 'Permet NULL',
zeroFill: 'Omplir amb zeros',
customValue: 'Valor personalitzat',
onUpdate: 'A l\'actualitzar',
deleteField: 'Esborra camp',
createNewIndex: 'Crea un nou índex',
addToIndex: 'Afegeix a l\'índex',
createNewTable: 'Crea una nova taula',
emptyTable: 'Taula buida',
deleteTable: 'Esborra la taula',
emptyConfirm: 'Confirmes buidar',
thereAreNoIndexes: 'No hi ha índexs',
thereAreNoForeign: 'No hi ha claus foranes',
createNewForeign: 'Crea una nova clau forana',
referenceTable: 'Taula de referència',
referenceField: 'Camp de referència',
foreignFields: 'Camps foranis',
invalidDefault: 'Valor per defecte no vàlid',
onDelete: 'Al esborrar',
selectStatement: 'Sentència SELECT',
triggerStatement: 'Sentència TRIGGER',
sqlSecurity: 'Seguretat SQL',
updateOption: 'Opció d\'actualització',
deleteView: 'Esborra vista',
createNewView: 'Crea una nova vista',
deleteTrigger: 'Esborra disparador',
createNewTrigger: 'Crea un nou disparador',
currentUser: 'Usuari actual',
routineBody: 'Cos de la rutina',
dataAccess: 'Accés a dades',
thereAreNoParameters: 'No hi ha paràmetres',
createNewParameter: 'Crea un nou paràmetre',
createNewRoutine: 'Crea una nova rutina emmagatzemada',
deleteRoutine: 'Esborra rutina emmagatzemada',
functionBody: 'Cos de la funció',
createNewFunction: 'Crea una nova funció',
deleteFunction: 'Esborra funció',
schedulerBody: 'Cos del planificador',
createNewScheduler: 'Crea un nou planificador',
deleteScheduler: 'Esborra planificador',
preserveOnCompletion: 'Conserva en finalitzar',
tableFiller: 'Ompletaula',
fakeDataLanguage: 'Idioma de dades fictícies',
queryDuration: 'Durada de la consulta',
setNull: 'Estableix NULL',
processesList: 'Llista de processos',
processInfo: 'Informació del procés',
manageUsers: 'Gestiona usuaris',
createNewSchema: 'Crea un nou esquema',
schemaName: 'Nom de l\'esquema',
editSchema: 'Edita l\'esquema',
deleteSchema: 'Esborra l\'esquema',
duplicateTable: 'Duplica taula',
noSchema: 'No hi ha esquema',
runQuery: 'Executa consulta',
thereAreNoTableFields: 'No hi ha camps a la taula',
newTable: 'Nova taula',
newView: 'Nova vista',
newTrigger: 'Nou disparador',
newRoutine: 'Nova rutina',
newFunction: 'Nova funció',
newScheduler: 'Nou planificador',
newTriggerFunction: 'Nova funció de disparador',
thereIsNoQueriesYet: 'Encara no hi ha consultes',
searchForQueries: 'Cerca consultes',
killProcess: 'Mata procés',
exportSchema: 'Exporta esquema',
importSchema: 'Importa esquema',
newInsertStmtEvery: 'Nova sentència INSERT cada',
processingTableExport: 'Processant {table}',
fetchingTableExport: 'Obtenint dades de {table}',
writingTableExport: 'Escrivint dades de {table}',
checkAllTables: 'Marca totes les taules',
uncheckAllTables: 'Desmarca totes les taules',
killQuery: 'Mata consulta',
insertRow: 'Insereix fila | Insereix files',
commitMode: 'Mode de validació',
autoCommit: 'Validació automàtica',
manualCommit: 'Validació manual',
disableFKChecks: 'Desactiva les comprovacions de claus foranes',
formatQuery: 'Formata consulta',
queryHistory: 'Històric de consultes',
clearQuery: 'Neteja consulta',
fillCell: 'Omplir cel·la',
executeSelectedQuery: 'Executa la consulta seleccionada',
noResultsPresent: 'No hi ha resultats',
sqlExportOptions: 'Opcions d\'exportació SQL',
targetTable: 'Taula objectiu',
switchDatabase: 'Canvia la base de dades',
importQueryErrors: 'Avís: ha ocorregut {n} error | Avís: han ocorregut {n} errors',
executedQueries: '{n} consulta executada | {n} consultes executades'
},
application: {
settings: 'Configuració',
general: 'General',
themes: 'Temes',
update: 'Actualitzar',
about: 'Sobre',
language: 'Idioma',
light: 'Clar',
dark: 'Fosc',
autoCompletion: 'Autocompletat',
application: 'Aplicació',
editor: 'Editor',
scratchpad: 'Bloc de notes',
changelog: 'Registre de canvis',
small: 'Petit',
medium: 'Mitjà',
large: 'Gran',
console: 'Consola',
shortcuts: 'Dreceres',
appearance: 'Aparença',
color: 'Color',
label: 'Etiqueta',
icon: 'Icona',
madeWithJS: 'Fet amb 💛 i JavaScript!',
checkForUpdates: 'Comprova actualitzacions',
noUpdatesAvailable: 'No hi ha actualitzacions disponibles',
checkingForUpdate: 'Comprovant actualitzacions',
checkFailure: 'La comprovació ha fallat, si us plau, torna-ho a intentar més tard',
updateAvailable: 'Actualització disponible',
downloadingUpdate: 'Descarregant actualització',
updateDownloaded: 'Actualització descarregada',
restartToInstall: 'Reinicia Antares per instal·lar',
notificationsTimeout: 'Temps d\'espera de notificacions',
openNewTab: 'Obre una nova pestanya',
unsavedChanges: 'Canvis no desats',
discardUnsavedChanges: 'Tens alguns canvis no desats. Tancant aquesta pestanya aquests canvis es descartaran.',
applicationTheme: 'Tema de l\'aplicació',
editorTheme: 'Tema de l\'editor',
wrapLongLines: 'Ajusta línies llargues',
includeBetaUpdates: 'Inclou actualitzacions beta',
markdownSupported: 'Suporta markdown',
plantATree: 'Planta un arbre',
dataTabPageSize: 'Mida de pàgina de la pestanya DATA',
noOpenTabs: 'No hi ha pestanyes obertes, navega per la barra de l\'esquerra o:',
restorePreviousSession: 'Restaura la sessió anterior',
closeTab: 'Tanca pestanya',
goToDownloadPage: 'Ves a la pàgina de descàrrega',
disableBlur: 'Desactiva el desenfoc',
missingOrIncompleteTranslation: 'Traducció absent o incompleta?',
findOutHowToContribute: 'Descobreix com contribuir',
disableScratchpad: 'Desactiva el bloc de notes',
reportABug: 'Informa d\'un error',
nextTab: 'Pestanya següent',
previousTab: 'Pestanya anterior',
selectTabNumber: 'Selecciona el número de pestanya {param}',
toggleConsole: 'Commuta la consola',
addShortcut: 'Afegeix drecera',
editShortcut: 'Edita drecera',
deleteShortcut: 'Esborra drecera',
restoreDefaults: 'Restaura els valors per defecte',
restoreDefaultsQuestion: 'Confirmes restaurar els valors per defecte?',
registerAShortcut: 'Registra una drecera',
invalidShortcutMessage: 'Combinació no vàlida, continua escrivint',
shortcutAlreadyExists: 'La drecera ja existeix',
saveContent: 'Desa el contingut',
openAllConnections: 'Obre totes les connexions',
openSettings: 'Obre configuració',
openScratchpad: 'Obre el bloc de notes',
runOrReload: 'Executa o recarrega',
openFilter: 'Obre filtre',
nextResultsPage: 'Pàgina de resultats següent',
previousResultsPage: 'Pàgina de resultats anterior',
editFolder: 'Edita carpeta',
folderName: 'Nom de la carpeta',
deleteFolder: 'Esborra carpeta',
editConnectionAppearance: 'Edita l\'aparença de la connexió',
defaultCopyType: 'Tipus de còpia per defecte',
showTableSize: 'Mostra la mida de la taula a la barra lateral',
showTableSizeDescription: 'Només MySQL/MariaDB. Activar aquesta opció pot afectar el rendiment en esquemes amb moltes taules.',
searchForSchemas: 'Cerca esquemes',
searchForElements: 'Cerca elements',
switchSearchMethod: 'Canvia el mètode de cerca',
closeAllTabs: 'Tanca totes les pestanyes',
closeOtherTabs: 'Tanca altres pestanyes',
closeTabsToLeft: 'Tanca pestanyes a l\'esquerra',
closeTabsToRight: 'Tanca pestanyes a la dreta',
csvFieldDelimiter: 'Delimitador de camp',
csvLinesTerminator: 'Terminador de línia',
csvStringDelimiter: 'Delimitador de cadena',
csvIncludeHeader: 'Inclou capçalera',
csvExportOptions: 'Opcions d\'exportació CSV',
phpArray: 'Matriu PHP'
},
faker: {
address: 'Adreça',
commerce: 'Comerç',
company: 'Empresa',
database: 'Base de dades',
date: 'Data',
finance: 'Finances',
git: 'Git',
hacker: 'Hacker',
internet: 'Internet',
lorem: 'Lorem',
name: 'Nom',
music: 'Música',
phone: 'Telèfon',
random: 'Aleatori',
system: 'Sistema',
time: 'Hora',
vehicle: 'Vehicle',
zipCode: 'Codi postal',
zipCodeByState: 'Codi postal per estat',
city: 'Ciutat',
cityPrefix: 'Prefix de ciutat',
citySuffix: 'Sufix de ciutat',
streetName: 'Nom del carrer',
streetAddress: 'Adreça del carrer',
streetSuffix: 'Sufix del carrer',
streetPrefix: 'Prefix del carrer',
secondaryAddress: 'Adreça secundària',
county: 'Comtat',
country: 'País',
countryCode: 'Codi de país',
state: 'Estat',
stateAbbr: 'Abreviatura de l\'estat',
latitude: 'Latitud',
longitude: 'Longitud',
direction: 'Direcció',
cardinalDirection: 'Direcció cardinal',
ordinalDirection: 'Direcció ordinal',
nearbyGPSCoordinate: 'Coordenada GPS propera',
timeZone: 'Zona horària',
color: 'Color',
department: 'Departament',
productName: 'Nom del producte',
price: 'Preu',
productAdjective: 'Adjectiu del producte',
productMaterial: 'Material del producte',
product: 'Producte',
productDescription: 'Descripció del producte',
suffixes: 'Sufixos',
companyName: 'Nom de l\'empresa',
companySuffix: 'Sufix de l\'empresa',
catchPhrase: 'Frase feta',
bs: 'BS',
catchPhraseAdjective: 'Adjectiu de la frase feta',
catchPhraseDescriptor: 'Descriptor de la frase feta',
catchPhraseNoun: 'Substantiu de la frase feta',
bsAdjective: 'Adjectiu BS',
bsBuzz: 'Buzz BS',
bsNoun: 'Substantiu BS',
column: 'Columna',
type: 'Tipus',
collation: 'Ordenació',
engine: 'Motor',
past: 'Passat',
now: 'Ara',
future: 'Futur',
between: 'Entre',
recent: 'Recent',
soon: 'Aviat',
month: 'Mes',
weekday: 'Dia de la setmana',
account: 'Compte',
accountName: 'Nom del compte',
routingNumber: 'Número de ruta',
mask: 'Màscara',
amount: 'Quantitat',
transactionType: 'Tipus de transacció',
currencyCode: 'Codi de moneda',
currencyName: 'Nom de la moneda',
currencySymbol: 'Símbol de moneda',
bitcoinAddress: 'Adreça Bitcoin',
litecoinAddress: 'Adreça Litecoin',
creditCardNumber: 'Número de targeta de crèdit',
creditCardCVV: 'CVV de la targeta de crèdit',
ethereumAddress: 'Adreça Ethereum',
iban: 'Iban',
bic: 'Bic',
transactionDescription: 'Descripció de la transacció',
branch: 'Branca',
commitEntry: 'Entrada de commit',
commitMessage: 'Missatge de commit',
commitSha: 'SHA de commit',
shortSha: 'SHA curt',
abbreviation: 'Abreviació',
adjective: 'Adjectiu',
noun: 'Substantiu',
verb: 'Verb',
ingverb: 'Gerundi',
phrase: 'Frase',
avatar: 'Avatar',
email: 'Correu electrònic',
exampleEmail: 'Correu electrònic d\'exemple',
userName: 'Nom d\'usuari',
protocol: 'Protocol',
url: 'Url',
domainName: 'Nom de domini',
domainSuffix: 'Sufix de domini',
domainWord: 'Paraula de domini',
ip: 'Ip',
ipv6: 'Ipv6',
userAgent: 'Agent d\'usuari',
mac: 'Mac',
password: 'Contrasenya',
word: 'Paraula',
words: 'Paraules',
sentence: 'Frase',
slug: 'Slug',
sentences: 'Frases',
paragraph: 'Paràgraf',
paragraphs: 'Paràgrafs',
text: 'Text',
lines: 'Línies',
genre: 'Gènere',
firstName: 'Nom',
lastName: 'Cognom',
middleName: 'Segon nom',
findName: 'Nom complet',
jobTitle: 'Títol del treball',
gender: 'Gènere',
prefix: 'Prefix',
suffix: 'Sufix',
title: 'Títol',
jobDescriptor: 'Descriptor de treball',
jobArea: 'Àrea de treball',
jobType: 'Tipus de treball',
phoneNumber: 'Número de telèfon',
phoneNumberFormat: 'Format de número de telèfon',
phoneFormats: 'Formats de telèfon',
number: 'Número',
float: 'Decimal',
arrayElement: 'Element de matriu',
arrayElements: 'Elements de matriu',
objectElement: 'Element d\'objecte',
uuid: 'Uuid',
boolean: 'Booleà',
image: 'Imatge',
locale: 'Localització',
alpha: 'Alfa',
alphaNumeric: 'Alfanumèric',
hexaDecimal: 'Hexadecimal',
fileName: 'Nom del fitxer',
commonFileName: 'Nom de fitxer comú',
mimeType: 'Tipus de mime',
commonFileType: 'Tipus de fitxer comú',
commonFileExt: 'Extensió de fitxer comú',
fileType: 'Tipus de fitxer',
fileExt: 'Extensió de fitxer',
directoryPath: 'Ruta del directori',
filePath: 'Ruta del fitxer',
semver: 'Semver',
manufacturer: 'Fabricant',
model: 'Model',
fuel: 'Combustible',
vin: 'Vin'
}
};

526
src/renderer/i18n/cs-CZ.ts Normal file
View File

@@ -0,0 +1,526 @@
export const csCZ = {
general: { // General purpose terms
edit: 'Upravit',
save: 'Uložit',
close: 'Zavřít',
delete: 'Smazat',
confirm: 'Potvrdit',
cancel: 'Zrušit',
send: 'Poslat',
refresh: 'Obnovit',
autoRefresh: 'Auto-obnova',
version: 'Verze',
donate: 'Příspěvek',
run: 'Spustit',
results: 'Výsledky',
size: 'Velikost',
mimeType: 'Mime-Type',
download: 'Stáhnout',
add: 'Přidat',
data: 'Data',
properties: 'Vlastnosti', // Lawondyss: Not used
name: 'Název',
clear: 'Vyčistit',
options: 'Možnosti',
insert: 'Vložit',
discard: 'Zahodit',
stay: 'Zůstat',
author: 'Autor',
upload: 'Nahrát',
browse: 'Procházet',
content: 'Obsah',
cut: 'Vyjmout',
copy: 'Kopírovat',
paste: 'Vložit',
duplicate: 'Duplikovat',
tools: 'Nástroje',
seconds: 'sekundy',
all: 'Vše',
new: 'Nové',
select: 'Vybrat',
change: 'Změnit',
includes: 'Zahrnout',
completed: 'Dokončeno',
aborted: 'Zrušeno',
disabled: 'Vypnuto',
enable: 'Zapnuto',
disable: 'Vypnout',
contributors: 'Přispěvatelé',
pin: 'Připnout', // Lawondyss: Not used
unpin: 'Odepnout', // Lawondyss: Not used
folder: 'Složka | Složky', // Lawondyss: Used only 1
none: 'Nic',
singleQuote: 'Apostrofy',
doubleQuote: 'Uvozovky',
deleteConfirm: 'Skutečně chcete smazat',
uploadFile: 'Nahrát soubor',
format: 'Formátovat', // Format code
history: 'Historie',
filter: 'Filtrovat',
manualValue: 'Vlastní hodnota',
selectAll: 'Vybrat vše',
pageNumber: 'Číslo stránky',
directoryPath: 'Adresář',
actionSuccessful: '{action} úspěšný',
outputFormat: 'Formát výstupu',
singleFile: 'Jediný {ext} soubor',
zipCompressedFile: 'ZIP komprimovaný {ext} soubor'
},
connection: { // Database connection
connectionName: 'Název',
hostName: 'Host',
client: 'Klient',
port: 'Port',
user: 'Uživatel',
password: 'Heslo',
credentials: 'Pověření',
connect: 'Připojit',
connected: 'Připojeno', // Lawondyss: Not used
disconnect: 'Odpojit',
disconnected: 'Odpojeno', // Lawondyss: Not used
ssl: 'SSL',
enableSsl: 'Použít SSL',
privateKey: 'Soukromý klíč',
certificate: 'Certifikát',
caCertificate: 'CA certifikát',
ciphers: 'Šifrování',
untrustedConnection: 'Nedůvěryhodné připojení',
passphrase: 'Heslová fráze',
sshTunnel: 'SSH tunel',
enableSsh: 'Použít SSH',
connectionString: 'String připojení',
addConnection: 'Add connection',
createConnection: 'Vytvořit připojení', // Lawondyss: Not used
createNewConnection: 'Vytvořit nové připojení',
askCredentials: 'Vyžadovat přihlášení',
testConnection: 'Vyzkoušet',
editConnection: 'Upravit připojení', // Lawondyss: Not used
deleteConnection: 'Smazat připojení',
connectionSuccessfullyMade: 'Spojení úspěšně navázáno!',
readOnlyMode: 'Pouze pro čtení',
allConnections: 'Všechna připojení',
searchForConnections: 'Hledat připojení'
},
database: { // Database related terms
schema: 'Schéma',
type: 'Typ',
insert: 'Vložit', // Lawondyss: Not used
indexes: 'Indexy',
foreignKeys: 'Cizí klíče',
length: 'Délka',
unsigned: 'Unsigned',
default: 'Výchozí',
comment: 'Komentář',
key: 'Klíč | Klíče', // Lawondyss: Used only 2
order: 'Pořadí',
expression: 'Výraz',
autoIncrement: 'Auto Increment',
engine: 'Engine',
field: 'Sloupec | Sloupce',
approximately: 'Přibližně',
total: 'Celkem',
table: 'Tabulka | Tabulky', // Lawondyss: Used only without argument
view: 'Pohled | Pohledy', // Lawondyss: Used only without argument
definer: 'Definér',
algorithm: 'Algoritmus',
trigger: 'Trigger | Triggery',
storedRoutine: 'Stored routina | Stored routiny',
scheduler: 'Scheduler | Schedulery',
event: 'Akce',
parameters: 'Parametry',
function: 'Funkce | Funkce',
deterministic: 'Deterministická',
context: 'Kontext',
export: 'Export',
import: 'Import',
returns: 'Vrací',
timing: 'Načasování',
state: 'Stav',
execution: 'Spustit',
starts: 'Od',
ends: 'Do',
variables: 'Proměnné',
processes: 'Procesy',
database: 'Databáze',
array: 'Pole',
structure: 'Struktura',
row: 'Řádek | Řádky',
cell: 'Buňka | Buňky',
triggerFunction: 'Trigger funkce | Trigger funkce',
routine: 'Routina | Routiny', // Lawondyss: Not used
drop: 'Drop',
commit: 'Commit',
rollback: 'Rollback',
ddl: 'DDL',
collation: 'Porovnání',
resultsTable: 'Tabulka výsledků',
unableEditFieldWithoutPrimary: 'Nelze upravit buňku bez primárního klíče ve výsledku', // Lawondyss: Not used
editCell: 'Upravit buňku', // Lawondyss: Not used
deleteRows: 'Smazat řádek | Smazat {count} řádků',
confirmToDeleteRows: 'Skutečně chcete smazat řádek? | Skutečně chcete smazat {count} řádků?',
addNewRow: 'Přidat nový řádek', // Lawondyss: Not used
numberOfInserts: 'Počet opakování',
affectedRows: 'Ovlivněno řádků',
createNewDatabase: 'Vytvořit novou databázi', // Lawondyss: Not used
databaseName: 'Název databáze', // Lawondyss: Not use
serverDefault: 'Porovnání serveru',
deleteDatabase: 'Smazat databázi', // Lawondyss: Not used
editDatabase: 'Upravit databázi', // Lawondyss: Not used
clearChanges: 'Zrušit změny',
addNewField: 'Přidat nový sloupec',
manageIndexes: 'Správa indexů',
manageForeignKeys: 'Správa cizích klíčů',
allowNull: 'Povolit NULL',
zeroFill: 'Doplnit nuly',
customValue: 'Vlastní hodnota',
onUpdate: 'Při změně',
deleteField: 'Smazat sloupec',
createNewIndex: 'Vytvořit nový index',
addToIndex: 'Přidat do indexu',
createNewTable: 'Vytvořit novou databázi', // Lawondyss: Not used
emptyTable: 'Smazat obsah tabulky',
duplicateTable: 'Duplikovat tabulku',
deleteTable: 'Smazat tabulku',
emptyConfirm: 'Skutečně smazat obsah tabulky',
thereAreNoIndexes: 'Nemá žádné indexy',
thereAreNoForeign: 'Nemá žádné cizí klíče',
createNewForeign: 'Vytvořit nový cizí klíč',
referenceTable: 'Ref. tabulka',
referenceField: 'Ref. sloupec',
foreignFields: 'Cizí sloupce', // Lawondyss: Not used
invalidDefault: 'Neplatná výchozí hodnota',
onDelete: 'Při smazání',
selectStatement: 'Definice pohledu',
triggerStatement: 'Definice triggeru',
sqlSecurity: 'SQL zabezpečení',
updateOption: 'Volba aktualizace',
deleteView: 'Smazat pohled',
createNewView: 'Vytvořit nový pohled', // Lawondyss: Not used
deleteTrigger: 'Smazat trigger',
createNewTrigger: 'Vytvořit nový trigger',
currentUser: 'Současný uživatel',
routineBody: 'Definice routiny',
dataAccess: 'Přístup k datům',
thereAreNoParameters: 'Nemá žádné parametry',
createNewParameter: 'Vytvořit nový parametr',
createNewRoutine: 'Vytvořit novou stored routinu',
deleteRoutine: 'Smazat stored routinu',
functionBody: 'Definice funkce',
createNewFunction: 'Vytvořit novou funkci',
deleteFunction: 'Smazat funkci',
schedulerBody: 'Definice Scheduleru',
createNewScheduler: 'Vytvořit nový scheduler',
deleteScheduler: 'Smazat scheduler',
preserveOnCompletion: 'Uchovat po dokončení',
tableFiller: 'Vyplňovač tabulky', // Lawondyss: Not used
fakeDataLanguage: 'Jazyk pro fake data',
queryDuration: 'Doba trvání dotazu',
setNull: 'Nastavit NULL',
processesList: 'Seznam procesů',
processInfo: 'Informace o procesu',
manageUsers: 'Správa uživatelů',
createNewSchema: 'Vytvořit nové schéma',
schemaName: 'Název schématu',
editSchema: 'Upravit schéma',
deleteSchema: 'Smazat schema',
noSchema: 'Bez schématu',
runQuery: 'Spustit dotaz', // Lawondyss: Not used
thereAreNoTableFields: 'Nemá žádné sloupce',
newTable: 'Nová tabulka',
newView: 'Nový pohled',
newTrigger: 'Nový trigger',
newRoutine: 'Nová routina',
newFunction: 'Nová funkce',
newScheduler: 'Nový scheduler',
newTriggerFunction: 'Nová trigger funkce',
thereIsNoQueriesYet: 'Nejsou tu žádné dotazy',
searchForQueries: 'Hledání dotazů',
killProcess: 'Zabít proces',
exportSchema: 'Exportovat schéma',
importSchema: 'Importovat schéma',
newInsertStmtEvery: 'Nový INSERT každých',
processingTableExport: 'Zpracovávám tabulku {table}',
fetchingTableExport: 'Získávám data tabulky {table}',
writingTableExport: 'Zapisuji data tabulky {table}',
checkAllTables: 'Vybrat všechny tabulky',
uncheckAllTables: 'Vybrat žádnou tabulku',
killQuery: 'Zabít dotaz', // Lawondyss: Not used
insertRow: 'Vložit řádek | Vložit řádky', // Lawondyss: Used only 2
commitMode: 'Způsob commitování',
autoCommit: 'Auto commit',
manualCommit: 'Ruční commit',
importQueryErrors: 'Varování: došlo k chybě {n} | Varování: došlo k chybám {n}', // Lawondyss: Used without n argument
executedQueries: '{n} dotaz spuštěn | {n} dotazy spuštěny', // Lawondyss: Used withoum n argument
disableFKChecks: 'Vypnout kontrolu cizích klíčů',
formatQuery: 'Formátovat dotaz', // Lawondyss: Not used, probably duplicate to general.format
queryHistory: 'Historie dotazů', // Lawondyss: Not used, probably duplicate to general.history
clearQuery: 'Clear query', // Lawondyss: Not used, probably duplicate to general.clear
fillCell: 'Vyplnit buňku',
executeSelectedQuery: 'Spustit vybraný dotaz',
noResultsPresent: 'Nejsou k dispozici žádné výsledky',
sqlExportOptions: 'Možnosti exportu SQL',
targetTable: 'Cílová tabulka',
switchDatabase: 'Přepnout databázi',
searchForElements: 'Vyhledávání prvků',
searchForSchemas: 'Vyhledávání schémat'
},
application: { // Application related terms
settings: 'Nastavení',
scratchpad: 'Zápisník',
disableScratchpad: 'Vypnout zápisník',
console: 'Konzole',
general: 'Obecné',
themes: 'Motivy',
update: 'Aktualizace',
about: 'Informace',
language: 'Jazyk',
shortcuts: 'Zkratky',
key: 'Klávesa | Klávesy', // Keyboard key // Lawondyss: Usedn only 2
event: 'Akce',
light: 'Světlý',
dark: 'Tmavý',
autoCompletion: 'Dokončování',
application: 'Aplikace',
editor: 'Editor',
changelog: 'Changelog',
small: 'Malé', // Lawondyss: Not used, probably obsolete font size settings
medium: 'Střední', // Lawondyss: Not used, probably obsolete font size settings
large: 'Velké', // Lawondyss: Not used, probably obsolete font size settings
appearance: 'Vzhled',
color: 'Barva',
label: 'Název',
icon: 'Ikona',
madeWithJS: 'Vytvořeno s 💛 a JavaScriptem!',
checkForUpdates: 'Zkontrolovat aktualizace',
noUpdatesAvailable: 'Žádné dostupné aktualizace',
checkingForUpdate: 'Kontrola aktualizací',
checkFailure: 'Kontrola selhala, zkuste to prosím později',
updateAvailable: 'Dostupná aktualizace',
downloadingUpdate: 'Stahuji aktualizaci',
updateDownloaded: 'Aktualizace stažena',
restartToInstall: 'Pro instalaci restartujte Antares',
includeBetaUpdates: 'Včetně beta aktualizací',
notificationsTimeout: 'Časový limit pro oznámení',
openNewTab: 'Otevřít novou kartu',
unsavedChanges: 'Neuložené změny',
discardUnsavedChanges: 'Máte nějaké neuložené změny. Zavřením této karty budou tyto změny zrušeny.',
applicationTheme: 'Motiv aplikace',
editorTheme: 'Motiv editoru',
wrapLongLines: 'Zalamovat dlouhé řádky',
markdownSupported: 'Podporován Markdown',
plantATree: 'Zasaďte strom', // Lawondyss: Not used
dataTabPageSize: 'Počet řádků na stránku',
noOpenTabs: 'Žádné otevřené karty, vyberte z elementů vlevo nebo:',
restorePreviousSession: 'Pamatovat si otevřené karty',
closeTab: 'Zavřít kartu',
goToDownloadPage: 'Pro stažení přejít na stránku',
disableBlur: 'Vypnout rozostření',
missingOrIncompleteTranslation: 'Chybějící nebo neúplný překlad?',
findOutHowToContribute: 'Zjistěte, jak můžete přispět.',
reportABug: 'Nahlásit chybu',
nextTab: 'Další karta',
previousTab: 'Předešlá karta',
selectTabNumber: 'Vybrat kartu číslo {param}',
toggleConsole: 'Přepnout konzoli',
addShortcut: 'Přidat zkratku',
editShortcut: 'Upravit zkratku',
deleteShortcut: 'Smazat zkratku',
restoreDefaults: 'Obnovit výchozí',
restoreDefaultsQuestion: 'Opravdu chcete obnovit výchozí zkratky?',
registerAShortcut: 'Stiskněte požadované klávesy',
invalidShortcutMessage: 'Neplatná kombinace, pokračujte v zadávání',
shortcutAlreadyExists: 'Zkratka již existuje',
saveContent: 'Uložit obsah',
openAllConnections: 'Otevřít všechna připojení',
openSettings: 'Otevřít nastavení',
openScratchpad: 'Otevřít zápisník',
runOrReload: 'Spustit dotaz',
openFilter: 'Otevřít filtr',
nextResultsPage: 'Další stránka výsledků',
previousResultsPage: 'Předešlá stránka výsledků',
editFolder: 'Upravit složku',
folderName: 'Název složky',
deleteFolder: 'Smazat složku', // Lawondyss: Not used
editConnectionAppearance: 'Upravit vzhled připojení', // Lawondyss: Not used
defaultCopyType: 'Výchozí typ kopírování',
showTableSize: 'Velikost tabulky v panelu',
showTableSizeDescription: 'Pouze MySQL/MariaDB. Povolení této možnosti může ovlivnit výkon u schémat s mnoha tabulkami.',
switchSearchMethod: 'Přepnout způsob vyhledávání',
phpArray: 'PHP pole',
closeAllTabs: 'Zavřít všechny karty',
closeOtherTabs: 'Zavřít ostatní karty',
closeTabsToLeft: 'Zavřít karty vlevo',
closeTabsToRight: 'Zavřít karty vpravo',
csvFieldDelimiter: 'Oddělovař',
csvLinesTerminator: 'Konec řádku',
csvStringDelimiter: 'Obalit text',
csvIncludeHeader: 'Včetně hlavičky',
csvExportOptions: 'Možnosti CSV exportu',
scratchPadDefaultValue: '# JAK PODPOŘIT ANTARES\n\n- [ ] Dát Antares hvězdičku [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Poslat názor či radu\n- [ ] Nahlásit chybu\n- [ ] Pokud se líbí, sdílet Antares s přáteli\n\n# O ZÁPISNÍKU\n\nToto je zápisník, který uchovává vaše **osobní poznámky**. Podporuje `markdown` formát, ale můžete použít obyčejný text.\nTento obsah je pouze ukázky, neváhejte ho smazat, abyste si udělali místo na poznámky.\n'
},
faker: { // Faker.js methods, used in random generated content
address: 'Address',
commerce: 'Commerce',
company: 'Company',
database: 'Database',
date: 'Date',
finance: 'Finance',
git: 'Git',
hacker: 'Hacker',
internet: 'Internet',
lorem: 'Lorem',
name: 'Name',
music: 'Music',
phone: 'Phone',
random: 'Random',
system: 'System',
time: 'Time',
vehicle: 'Vehicle',
zipCode: 'Zip code',
zipCodeByState: 'Zip code by state',
city: 'City',
cityPrefix: 'City prefix',
citySuffix: 'City suffix',
streetName: 'Street name',
streetAddress: 'Street address',
streetSuffix: 'Street suffix',
streetPrefix: 'Street prefix',
secondaryAddress: 'Secondary address',
county: 'County',
country: 'Country',
countryCode: 'Country code',
state: 'State',
stateAbbr: 'State abbreviation',
latitude: 'Latitude',
longitude: 'Longitude',
direction: 'Direction',
cardinalDirection: 'Cardinal direction',
ordinalDirection: 'Ordinal direction',
nearbyGPSCoordinate: 'Nearby GPS coordinate',
timeZone: 'Time zone',
color: 'Color',
department: 'Department',
productName: 'Product name',
price: 'Price',
productAdjective: 'Product adjective',
productMaterial: 'Product material',
product: 'Product',
productDescription: 'Product description',
suffixes: 'Suffixes',
companyName: 'Company name',
companySuffix: 'Company suffix',
catchPhrase: 'Catch phrase',
bs: 'BS',
catchPhraseAdjective: 'Catch phrase adjective',
catchPhraseDescriptor: 'Catch phrase descriptor',
catchPhraseNoun: 'Catch phrase noun',
bsAdjective: 'BS adjective',
bsBuzz: 'BS buzz',
bsNoun: 'BS noun',
column: 'Column',
type: 'Type',
collation: 'Collation',
engine: 'Engine',
past: 'Past',
now: 'Now',
future: 'Future',
between: 'Between',
recent: 'Recent',
soon: 'Soon',
month: 'Month',
weekday: 'Weekday',
account: 'Account',
accountName: 'Account name',
routingNumber: 'Routing number',
mask: 'Mask',
amount: 'Amount',
transactionType: 'Transaction type',
currencyCode: 'Currency code',
currencyName: 'Currency name',
currencySymbol: 'Currency symbol',
bitcoinAddress: 'Bitcoin address',
litecoinAddress: 'Litecoin address',
creditCardNumber: 'Credit card number',
creditCardCVV: 'Credit card CVV',
ethereumAddress: 'Ethereum address',
iban: 'Iban',
bic: 'Bic',
transactionDescription: 'Transaction description',
branch: 'Branch',
commitEntry: 'Commit entry',
commitMessage: 'Commit message',
commitSha: 'Commit SHA',
shortSha: 'Short SHA',
abbreviation: 'Abbreviation',
adjective: 'Adjective',
noun: 'Noun',
verb: 'Verb',
ingverb: 'Ingverb',
phrase: 'Phrase',
avatar: 'Avatar',
email: 'Email',
exampleEmail: 'Example email',
userName: 'Username',
protocol: 'Protocol',
url: 'Url',
domainName: 'Domin name',
domainSuffix: 'Domain suffix',
domainWord: 'Domain word',
ip: 'Ip',
ipv6: 'Ipv6',
userAgent: 'User agent',
mac: 'Mac',
password: 'Password',
word: 'Word',
words: 'Words',
sentence: 'Sentence',
slug: 'Slug',
sentences: 'Sentences',
paragraph: 'Paragraph',
paragraphs: 'Paragraphs',
text: 'Text',
lines: 'Lines',
genre: 'Genre',
firstName: 'First name',
lastName: 'Last name',
middleName: 'Middle name',
findName: 'Full name',
jobTitle: 'Job title',
gender: 'Gender',
prefix: 'Prefix',
suffix: 'Suffix',
title: 'Title',
jobDescriptor: 'Job descriptor',
jobArea: 'Job area',
jobType: 'Job type',
phoneNumber: 'Phone number',
phoneNumberFormat: 'Phone number format',
phoneFormats: 'Phone formats',
number: 'Number',
float: 'Float',
arrayElement: 'Array element',
arrayElements: 'Array elements',
objectElement: 'Object element',
uuid: 'Uuid',
boolean: 'Boolean',
image: 'Image',
locale: 'Locale',
alpha: 'Alpha',
alphaNumeric: 'Alphanumeric',
hexaDecimal: 'Hexadecimal',
fileName: 'File name',
commonFileName: 'Common file name',
mimeType: 'Mime type',
commonFileType: 'Common file type',
commonFileExt: 'Common file extension',
fileType: 'File type',
fileExt: 'File extension',
directoryPath: 'Directory path',
filePath: 'File path',
semver: 'Semver',
manufacturer: 'Manufacturer',
model: 'Model',
fuel: 'Fuel',
vin: 'Vin'
}
}

View File

@@ -39,6 +39,7 @@ export const enUS = {
new: 'New',
select: 'Select',
change: 'Change',
include: 'Include',
includes: 'Includes',
completed: 'Completed',
aborted: 'Aborted',
@@ -292,6 +293,10 @@ export const enUS = {
label: 'Label',
icon: 'Icon',
fileName: 'File name',
choseFile: 'Chose file',
data: 'Data',
password: 'Password',
required: 'Required',
madeWithJS: 'Made with 💛 and JavaScript!',
checkForUpdates: 'Check for updates',
noUpdatesAvailable: 'No updates available',
@@ -358,7 +363,18 @@ export const enUS = {
csvStringDelimiter: 'String delimiter',
csvIncludeHeader: 'Include header',
csvExportOptions: 'CSV export options',
scratchPadDefaultValue: '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n'
exportData: 'Export data',
exportDataExplanation: 'Export saved connections to Antares. You will be asked for a password to encrypt the exported file.',
importData: 'Import data',
importDataExplanation: 'Imports an .antares file containing connections. You will need to enter the password defined during export.',
includeConnectionPasswords: 'Include connection passwords',
includeFolders: 'Include folders',
encryptionPassword: 'Encryption password',
encryptionPasswordError: 'The encryption password must be at least 8 characters long.',
ignoreDuplicates: 'Ignore duplicates',
wrongImportPassword: 'Wrong import password',
wrongFileFormat: 'Wrong file format',
dataImportSuccess: 'Data successfully imported'
},
faker: { // Faker.js methods, used in random generated content
address: 'Address',

View File

@@ -349,7 +349,6 @@ export const frFR = {
csvStringDelimiter: 'Séparateur',
csvIncludeHeader: 'Inclure l\'en-tête',
csvExportOptions: 'Options d\'export CSV',
scratchPadDefaultValue: '# COMMENT SOUTENIR ANTARES\n\n- [ ] Laissez une etoile à Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Envoyez vos avis et conseils\n- [ ] Signalez les bugs\n- [ ] Si vous l\'appréciez, partagez Antares avec des amis\n\n# A PROPOS DU BLOC-NOTES\n\nCeci est un bloc-notes où vous pouvez sauvegarder vos **notes personnelles**. Il supporte le format `markdown`, mais vous êtes libre d\'utiliser du texte standard.\nCe contenu est juste un modèle, vous pouvez a tout moment l\'effacer pour le remplacer par vos notes.\n',
phpArray: 'Tableau PHP'
},
faker: {

View File

@@ -13,6 +13,8 @@ import { ruRU } from './ru-RU';
import { idID } from './id-ID';
import { koKR } from './ko-KR';
import { nlNL } from './nl-NL';
import { caES } from './ca-ES';
import { csCZ } from './cs-CZ';
const messages = {
'en-US': enUS,
'it-IT': itIT,
@@ -27,7 +29,9 @@ const messages = {
'ru-RU': ruRU,
'id-ID': idID,
'ko-KR': koKR,
'nl-NL': nlNL
'nl-NL': nlNL,
'ca-ES': caES,
'cs-CZ': csCZ,
};
type NestedPartial<T> = {

View File

@@ -351,7 +351,6 @@ export const ptBR = {
csvStringDelimiter: 'Delimitador da String',
csvIncludeHeader: 'Incluir cabeçalho',
csvExportOptions: 'Opções de exportação do CSV',
scratchPadDefaultValue: '# COMO AJUDAR O ANTARES\n\n- [ ] Deixe sua estrela para o Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Envie sugestões e avisos\n- [ ] Relate bugs\n- [ ] Se você gostar, compartilhe o Antares com amigos\n\n# SOBRE O BLOCO DE NOTAS\n\nEsse é o bloco de notas para salvar suas **notas pessoais**. ele suporta o formato `markdown`, porém você é livre para usar qualquer texto.\nEsse conteúdo é apenas um texto, fique a vontade para limpar e obter mais espaço para suas notas.\n',
phpArray: 'Array PHP'
},
faker: {

View File

@@ -12,5 +12,7 @@ export const localesNames: {[key: string]: string} = {
'ru-RU': 'Русский',
'id-ID': 'Bahasa Indonesia',
'ko-KR': '한국어',
'nl-NL': 'Nederlands'
'nl-NL': 'Nederlands',
'ca-ES': 'Català',
'cs-CZ': 'Čeština',
};

View File

@@ -5,7 +5,7 @@ import { toRaw } from 'vue';
* @param {*} val
* @param {Boolean} json converts the value in JSON object (default true)
*/
export function unproxify (val: any, json = true): any {
export function unproxify<T = any> (val: T, json = true): T {
if (json)// JSON conversion
return JSON.parse(JSON.stringify(val));
else if (Array.isArray(val))// If array

View File

@@ -144,11 +144,17 @@
cursor: default;
}
.input-group .input-group-addon {
border-color: #3f3f3f;
.has-error .form-input {
background: $bg-color-dark;
}
.input-group {
.input-group-addon {
border-color: #3f3f3f;
background: $bg-color-dark;
}
}
.empty {
color: $body-font-color-dark;
background: transparent;

View File

@@ -219,6 +219,16 @@ export const useConnectionsStore = defineStore('connections', {
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).filter(el => !emptyFolders.includes(el.uid));
persistentStore.set('connectionsOrder', this.connectionsOrder);
},
importConnections (importObj: {
connections: ConnectionParams[];
connectionsOrder: SidebarElement[];
}) {
this.connections = [...this.connections, ...importObj.connections];
this.connectionsOrder = [...this.connectionsOrder, ...importObj.connectionsOrder];
persistentStore.set('connections', this.connections);
persistentStore.set('connectionsOrder', this.connectionsOrder);
}
}
});