mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Compare commits
19 Commits
v0.7.16-be
...
v0.7.16-be
Author | SHA1 | Date | |
---|---|---|---|
d702ce3fa9 | |||
63544e95da | |||
6df214558f | |||
f5b86e59e7 | |||
27f0068415 | |||
|
52e42fa1b5 | ||
|
5b9b539bc7 | ||
832aa75ebe | |||
aba67f3872 | |||
5a1644f023 | |||
e372712556 | |||
d4727a7d20 | |||
|
f2c2f33afa | ||
|
6dc4bdd0c0 | ||
|
9c6f1a9ea5 | ||
dd264f802e | |||
fed0e10702 | |||
e7ce4ef6ed | |||
e03f2eef49 |
@@ -239,6 +239,15 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"platform"
|
"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,
|
"contributorsPerLine": 7,
|
||||||
|
15
CHANGELOG.md
15
CHANGELOG.md
@@ -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.
|
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)
|
### [0.7.16-beta.0](https://github.com/antares-sql/antares/compare/v0.7.15...v0.7.16-beta.0) (2023-08-11)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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://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://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/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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"version": "0.7.16-beta.0",
|
"version": "0.7.16-beta.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"version": "0.7.16-beta.0",
|
"version": "0.7.16-beta.1",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "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.",
|
"description": "A modern, fast and productivity driven SQL client with a focus in UX.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/antares-sql/antares.git",
|
"repository": "https://github.com/antares-sql/antares.git",
|
||||||
|
@@ -31,10 +31,10 @@ parts:
|
|||||||
fi
|
fi
|
||||||
# Get the latest releases json
|
# Get the latest releases json
|
||||||
echo "Get GitHub releases..."
|
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.
|
# Get the version from the tag_name and the download URL.
|
||||||
VERSION=$(jq . releases.json | grep tag_name | cut -d'"' -f4 | sed s'/release-//')
|
VERSION=$(jq . releases.json | grep tag_name | head -1 | cut -d'"' -f4 | sed s'/release-//')
|
||||||
DEB_URL=$(cat releases.json | jq -r ".assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
|
DEB_URL=$(cat releases.json | jq -r ".[0].assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
|
||||||
DEB=$(basename "${DEB_URL}")
|
DEB=$(basename "${DEB_URL}")
|
||||||
echo "Downloading ${DEB_URL}..."
|
echo "Downloading ${DEB_URL}..."
|
||||||
wget --quiet "${DEB_URL}" -O "${SNAPCRAFT_PART_INSTALL}/${DEB}"
|
wget --quiet "${DEB_URL}" -O "${SNAPCRAFT_PART_INSTALL}/${DEB}"
|
||||||
@@ -79,7 +79,7 @@ parts:
|
|||||||
- libdb5.3
|
- libdb5.3
|
||||||
- libdbus-1-3
|
- libdbus-1-3
|
||||||
- libexpat1
|
- libexpat1
|
||||||
- libffi7
|
- libffi8
|
||||||
- libgcc-s1
|
- libgcc-s1
|
||||||
- libgcrypt20
|
- libgcrypt20
|
||||||
- libglib2.0-0
|
- libglib2.0-0
|
||||||
@@ -87,9 +87,9 @@ parts:
|
|||||||
- libgnutls30
|
- libgnutls30
|
||||||
- libgpg-error0
|
- libgpg-error0
|
||||||
- libgssapi-krb5-2
|
- libgssapi-krb5-2
|
||||||
- libhogweed5
|
- libhogweed6
|
||||||
- libidn2-0
|
- libidn2-0
|
||||||
- libjson-c4
|
- libjson-c5
|
||||||
- libk5crypto3
|
- libk5crypto3
|
||||||
- libkeyutils1
|
- libkeyutils1
|
||||||
- libkrb5-3
|
- libkrb5-3
|
||||||
@@ -97,12 +97,12 @@ parts:
|
|||||||
- liblz4-1
|
- liblz4-1
|
||||||
- liblzma5
|
- liblzma5
|
||||||
- libmount1
|
- libmount1
|
||||||
- libnettle7
|
- libnettle8
|
||||||
- libp11-kit0
|
- libp11-kit0
|
||||||
- libpcre2-8-0
|
- libpcre2-8-0
|
||||||
- libselinux1
|
- libselinux1
|
||||||
- libsqlite3-0
|
- libsqlite3-0
|
||||||
- libssl1.1
|
- libssl3
|
||||||
- libstdc++6
|
- libstdc++6
|
||||||
- libsystemd0
|
- libsystemd0
|
||||||
- libtasn1-6
|
- libtasn1-6
|
||||||
|
31
src/common/libs/encrypter.ts
Normal file
31
src/common/libs/encrypter.ts
Normal 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
|
||||||
|
};
|
@@ -425,7 +425,7 @@ export class SQLiteClient extends AntaresCore {
|
|||||||
|
|
||||||
return results.rows.map(row => {
|
return results.rows.map(row => {
|
||||||
return {
|
return {
|
||||||
sql: row.sql.match(/(?<=AS ).*?$/gs)[0],
|
sql: row.sql.match(/(?<=(AS|as)( |\n)).*?$/gs)[0],
|
||||||
name: view
|
name: view
|
||||||
};
|
};
|
||||||
})[0];
|
})[0];
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
:id="`id_${id}`"
|
:id="`id_${id}`"
|
||||||
class="file-uploader-input"
|
class="file-uploader-input"
|
||||||
type="file"
|
type="file"
|
||||||
|
:accept="accept"
|
||||||
@change="$emit('change', $event)"
|
@change="$emit('change', $event)"
|
||||||
>
|
>
|
||||||
</form>
|
</form>
|
||||||
@@ -33,6 +34,10 @@ defineProps({
|
|||||||
default: 'Browse',
|
default: 'Browse',
|
||||||
type: String
|
type: String
|
||||||
},
|
},
|
||||||
|
accept: {
|
||||||
|
default: '',
|
||||||
|
type: String
|
||||||
|
},
|
||||||
modelValue: {
|
modelValue: {
|
||||||
default: '',
|
default: '',
|
||||||
type: String
|
type: String
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<div class="modal-title h6">
|
<div class="modal-title h6">
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<i class="mdi mdi-24px mdi-brush-variant mr-1" />
|
<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>
|
||||||
</div>
|
</div>
|
||||||
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
|
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
required
|
required
|
||||||
readonly
|
readonly
|
||||||
:placeholder="t('database.schemaName')"
|
@click.prevent="openPathDialog"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-auto px-0">
|
<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') }}
|
{{ t('general.close') }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
|
@@ -37,6 +37,13 @@
|
|||||||
>
|
>
|
||||||
<a class="tab-link">{{ t('application.shortcuts') }}</a>
|
<a class="tab-link">{{ t('application.shortcuts') }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li
|
||||||
|
class="tab-item c-hand"
|
||||||
|
:class="{'active': selectedTab === 'data'}"
|
||||||
|
@click="selectTab('data')"
|
||||||
|
>
|
||||||
|
<a class="tab-link">{{ t('application.data') }}</a>
|
||||||
|
</li>
|
||||||
<li
|
<li
|
||||||
v-if="updateStatus !== 'disabled'"
|
v-if="updateStatus !== 'disabled'"
|
||||||
class="tab-item c-hand"
|
class="tab-item c-hand"
|
||||||
@@ -366,6 +373,9 @@
|
|||||||
<div v-show="selectedTab === 'shortcuts'" class="panel-body py-4">
|
<div v-show="selectedTab === 'shortcuts'" class="panel-body py-4">
|
||||||
<ModalSettingsShortcuts />
|
<ModalSettingsShortcuts />
|
||||||
</div>
|
</div>
|
||||||
|
<div v-show="selectedTab === 'data'" class="panel-body py-4">
|
||||||
|
<ModalSettingsData />
|
||||||
|
</div>
|
||||||
<div v-show="selectedTab === 'update'" class="panel-body py-4">
|
<div v-show="selectedTab === 'update'" class="panel-body py-4">
|
||||||
<ModalSettingsUpdate />
|
<ModalSettingsUpdate />
|
||||||
</div>
|
</div>
|
||||||
@@ -411,6 +421,7 @@ import { localesNames } from '@/i18n/supported-locales';
|
|||||||
import ModalSettingsUpdate from '@/components/ModalSettingsUpdate.vue';
|
import ModalSettingsUpdate from '@/components/ModalSettingsUpdate.vue';
|
||||||
import ModalSettingsChangelog from '@/components/ModalSettingsChangelog.vue';
|
import ModalSettingsChangelog from '@/components/ModalSettingsChangelog.vue';
|
||||||
import ModalSettingsShortcuts from '@/components/ModalSettingsShortcuts.vue';
|
import ModalSettingsShortcuts from '@/components/ModalSettingsShortcuts.vue';
|
||||||
|
import ModalSettingsData from '@/components/ModalSettingsData.vue';
|
||||||
import BaseTextEditor from '@/components/BaseTextEditor.vue';
|
import BaseTextEditor from '@/components/BaseTextEditor.vue';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import { AvailableLocale } from '@/i18n';
|
import { AvailableLocale } from '@/i18n';
|
||||||
@@ -648,10 +659,14 @@ onBeforeUnmount(() => {
|
|||||||
.modal-body {
|
.modal-body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.tab-link {
|
.tab-item {
|
||||||
overflow: hidden;
|
max-width: 20%;
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
.tab-link {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-body {
|
.panel-body {
|
||||||
|
60
src/renderer/components/ModalSettingsData.vue
Normal file
60
src/renderer/components/ModalSettingsData.vue
Normal 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>
|
331
src/renderer/components/ModalSettingsDataExport.vue
Normal file
331
src/renderer/components/ModalSettingsDataExport.vue
Normal 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>
|
263
src/renderer/components/ModalSettingsDataImport.vue
Normal file
263
src/renderer/components/ModalSettingsDataImport.vue
Normal 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>
|
@@ -45,6 +45,7 @@
|
|||||||
<button
|
<button
|
||||||
class="btn btn-dark btn-sm"
|
class="btn btn-dark btn-sm"
|
||||||
:disabled="isSaving || !localFields.length"
|
:disabled="isSaving || !localFields.length"
|
||||||
|
:title="t('database.manageForeignKeys')"
|
||||||
@click="showForeignModal"
|
@click="showForeignModal"
|
||||||
>
|
>
|
||||||
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
<button
|
<button
|
||||||
class="btn btn-dark btn-sm mr-0"
|
class="btn btn-dark btn-sm mr-0"
|
||||||
:disabled="isSaving"
|
:disabled="isSaving"
|
||||||
|
:title="t('database.manageIndexes')"
|
||||||
@click="showForeignModal"
|
@click="showForeignModal"
|
||||||
>
|
>
|
||||||
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
||||||
|
522
src/renderer/i18n/ca-ES.ts
Normal file
522
src/renderer/i18n/ca-ES.ts
Normal 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
526
src/renderer/i18n/cs-CZ.ts
Normal 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'
|
||||||
|
}
|
||||||
|
}
|
@@ -39,6 +39,7 @@ export const enUS = {
|
|||||||
new: 'New',
|
new: 'New',
|
||||||
select: 'Select',
|
select: 'Select',
|
||||||
change: 'Change',
|
change: 'Change',
|
||||||
|
include: 'Include',
|
||||||
includes: 'Includes',
|
includes: 'Includes',
|
||||||
completed: 'Completed',
|
completed: 'Completed',
|
||||||
aborted: 'Aborted',
|
aborted: 'Aborted',
|
||||||
@@ -292,6 +293,10 @@ export const enUS = {
|
|||||||
label: 'Label',
|
label: 'Label',
|
||||||
icon: 'Icon',
|
icon: 'Icon',
|
||||||
fileName: 'File name',
|
fileName: 'File name',
|
||||||
|
choseFile: 'Chose file',
|
||||||
|
data: 'Data',
|
||||||
|
password: 'Password',
|
||||||
|
required: 'Required',
|
||||||
madeWithJS: 'Made with 💛 and JavaScript!',
|
madeWithJS: 'Made with 💛 and JavaScript!',
|
||||||
checkForUpdates: 'Check for updates',
|
checkForUpdates: 'Check for updates',
|
||||||
noUpdatesAvailable: 'No updates available',
|
noUpdatesAvailable: 'No updates available',
|
||||||
@@ -358,7 +363,18 @@ export const enUS = {
|
|||||||
csvStringDelimiter: 'String delimiter',
|
csvStringDelimiter: 'String delimiter',
|
||||||
csvIncludeHeader: 'Include header',
|
csvIncludeHeader: 'Include header',
|
||||||
csvExportOptions: 'CSV export options',
|
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
|
faker: { // Faker.js methods, used in random generated content
|
||||||
address: 'Address',
|
address: 'Address',
|
||||||
|
@@ -349,7 +349,6 @@ export const frFR = {
|
|||||||
csvStringDelimiter: 'Séparateur',
|
csvStringDelimiter: 'Séparateur',
|
||||||
csvIncludeHeader: 'Inclure l\'en-tête',
|
csvIncludeHeader: 'Inclure l\'en-tête',
|
||||||
csvExportOptions: 'Options d\'export CSV',
|
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'
|
phpArray: 'Tableau PHP'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
|
@@ -13,6 +13,8 @@ import { ruRU } from './ru-RU';
|
|||||||
import { idID } from './id-ID';
|
import { idID } from './id-ID';
|
||||||
import { koKR } from './ko-KR';
|
import { koKR } from './ko-KR';
|
||||||
import { nlNL } from './nl-NL';
|
import { nlNL } from './nl-NL';
|
||||||
|
import { caES } from './ca-ES';
|
||||||
|
import { csCZ } from './cs-CZ';
|
||||||
const messages = {
|
const messages = {
|
||||||
'en-US': enUS,
|
'en-US': enUS,
|
||||||
'it-IT': itIT,
|
'it-IT': itIT,
|
||||||
@@ -27,7 +29,9 @@ const messages = {
|
|||||||
'ru-RU': ruRU,
|
'ru-RU': ruRU,
|
||||||
'id-ID': idID,
|
'id-ID': idID,
|
||||||
'ko-KR': koKR,
|
'ko-KR': koKR,
|
||||||
'nl-NL': nlNL
|
'nl-NL': nlNL,
|
||||||
|
'ca-ES': caES,
|
||||||
|
'cs-CZ': csCZ,
|
||||||
};
|
};
|
||||||
|
|
||||||
type NestedPartial<T> = {
|
type NestedPartial<T> = {
|
||||||
|
@@ -351,7 +351,6 @@ export const ptBR = {
|
|||||||
csvStringDelimiter: 'Delimitador da String',
|
csvStringDelimiter: 'Delimitador da String',
|
||||||
csvIncludeHeader: 'Incluir cabeçalho',
|
csvIncludeHeader: 'Incluir cabeçalho',
|
||||||
csvExportOptions: 'Opções de exportação do CSV',
|
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'
|
phpArray: 'Array PHP'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
|
@@ -12,5 +12,7 @@ export const localesNames: {[key: string]: string} = {
|
|||||||
'ru-RU': 'Русский',
|
'ru-RU': 'Русский',
|
||||||
'id-ID': 'Bahasa Indonesia',
|
'id-ID': 'Bahasa Indonesia',
|
||||||
'ko-KR': '한국어',
|
'ko-KR': '한국어',
|
||||||
'nl-NL': 'Nederlands'
|
'nl-NL': 'Nederlands',
|
||||||
|
'ca-ES': 'Català',
|
||||||
|
'cs-CZ': 'Čeština',
|
||||||
};
|
};
|
||||||
|
@@ -5,7 +5,7 @@ import { toRaw } from 'vue';
|
|||||||
* @param {*} val
|
* @param {*} val
|
||||||
* @param {Boolean} json converts the value in JSON object (default true)
|
* @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
|
if (json)// JSON conversion
|
||||||
return JSON.parse(JSON.stringify(val));
|
return JSON.parse(JSON.stringify(val));
|
||||||
else if (Array.isArray(val))// If array
|
else if (Array.isArray(val))// If array
|
||||||
|
@@ -144,11 +144,17 @@
|
|||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.input-group .input-group-addon {
|
.has-error .form-input {
|
||||||
border-color: #3f3f3f;
|
|
||||||
background: $bg-color-dark;
|
background: $bg-color-dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
.input-group-addon {
|
||||||
|
border-color: #3f3f3f;
|
||||||
|
background: $bg-color-dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.empty {
|
.empty {
|
||||||
color: $body-font-color-dark;
|
color: $body-font-color-dark;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
|
@@ -219,6 +219,16 @@ export const useConnectionsStore = defineStore('connections', {
|
|||||||
|
|
||||||
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).filter(el => !emptyFolders.includes(el.uid));
|
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).filter(el => !emptyFolders.includes(el.uid));
|
||||||
persistentStore.set('connectionsOrder', this.connectionsOrder);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user