Added translation tags for settings, tabs, modals

This commit is contained in:
Stela Augustinova
2025-11-30 19:38:01 +01:00
parent d3322a4a15
commit e14f59256d
26 changed files with 147 additions and 133 deletions

View File

@@ -81,7 +81,7 @@
import { getLocalStorage } from '../utility/storageCache';
import registerCommand from './registerCommand';
import { formatKeyText, switchCurrentDatabase } from '../utility/common';
import { _tval, __t } from '../translations';
import { _tval, __t, _t } from '../translations';
let domInput;
let filter = '';
@@ -181,7 +181,7 @@
domInput.focus();
}}
>
<FontIcon icon="icon menu" /> Commands
<FontIcon icon="icon menu" /> {_t('commandPalette.commands', { defaultMessage: 'Commands' })}
</div>
<div
class="page"
@@ -191,7 +191,7 @@
domInput.focus();
}}
>
<FontIcon icon="icon database" /> Database
<FontIcon icon="icon database" /> {_t('common.database', { defaultMessage: 'Database' })}
</div>
</div>
<div class="mainInner">
@@ -202,7 +202,7 @@
bind:value={filter}
on:keydown={handleKeyDown}
placeholder={parentCommand?.text ||
($visibleCommandPalette == 'database' ? 'Search in database' : 'Search in commands')}
($visibleCommandPalette == 'database' ? _t('commandPalette.searchInDatabase', { defaultMessage: 'Search in database' }) : _t('commandPalette.searchInCommands', { defaultMessage: 'Search in commands' }))}
/>
</div>
<div class="content">

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import _ from 'lodash';
import DropDownButton from '../buttons/DropDownButton.svelte';
import { _tval } from '../translations';
interface TabDef {
label: string;
@@ -46,7 +47,7 @@
data-testid={tab.testid}
>
<span class="ml-2 noselect">
{tab.label}
{_tval(tab.label)}
</span>
</div>
{/each}

View File

@@ -8,6 +8,7 @@
import Link from '../elements/Link.svelte';
import FontIcon from '../icons/FontIcon.svelte';
import { isProApp } from '../utility/proTools';
import { _t } from '../translations';
const config = useConfig();
$: version = $config?.version;
@@ -15,18 +16,18 @@
</script>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">About DbGate</svelte:fragment>
<svelte:fragment slot="header">{_t('aboutModal.aboutDbGate', { defaultMessage: 'About DbGate' })}</svelte:fragment>
<div class="flex">
<img src="logo192.png" />
<div class="ml-4">
<div>
Version: <span>{version}</span>
{_t('aboutModal.version', { defaultMessage: 'Version' })}: <span>{version}</span>
</div>
<div>
Build date: <span>{moment(buildTime).format('YYYY-MM-DD')}</span>
{_t('aboutModal.buildDate', { defaultMessage: 'Build date' })}: <span>{moment(buildTime).format('YYYY-MM-DD')}</span>
</div>
<div>
License type: <span
{_t('aboutModal.licenseType', { defaultMessage: 'License type' })}: <span
>{$config?.checkedLicense && $config?.checkedLicense?.type != 'community'
? ($config?.checkedLicense?.licenseTypeObj?.name ?? 'Unknown')
: 'Community'}</span
@@ -34,16 +35,16 @@
</div>
{#if $config?.checkedLicense?.users}
<div>
User count: <span>{$config?.checkedLicense?.users}</span>
{_t('aboutModal.userCount', { defaultMessage: 'User count' })}: <span>{$config?.checkedLicense?.users}</span>
</div>
{/if}
<div class="mt-2">
<FontIcon icon="mdi mdi-web color-icon-blue" /> Web: <Link href="https://www.dbgate.io">dbgate.io</Link>
<FontIcon icon="mdi mdi-web color-icon-blue" /> {_t('aboutModal.web', { defaultMessage: 'Web' })}: <Link href="https://www.dbgate.io">dbgate.io</Link>
</div>
{#if isProApp()}
<div>
<FontIcon icon="mdi mdi-email color-icon-red" /> Support: <Link href="mailto:support@dbgate.io"
<FontIcon icon="mdi mdi-email color-icon-red" /> {_t('aboutModal.support', { defaultMessage: 'Support' })}: <Link href="mailto:support@dbgate.io"
>support@dbgate.io</Link
>
</div>
@@ -55,10 +56,10 @@
</div> -->
<div class="mt-2">
Source codes: <Link href="https://github.com/dbgate/dbgate/">GitHub</Link>
{_t('aboutModal.sourceCodes', { defaultMessage: 'Source codes' })}: <Link href="https://github.com/dbgate/dbgate/">GitHub</Link>
</div>
<div>
Docker container: <Link
{_t('aboutModal.dockerContainer', { defaultMessage: 'Docker container' })}: <Link
href={isProApp()
? 'https://hub.docker.com/r/dbgate/dbgate-premium'
: 'https://hub.docker.com/r/dbgate/dbgate'}>Docker Hub</Link
@@ -69,13 +70,13 @@
</div> -->
<div class="mt-2">
Produced by: <span>Sprinx System a.s.</span>
{_t('aboutModal.producedBy', { defaultMessage: 'Produced by' })}: <span>Sprinx System a.s.</span>
</div>
</div>
</div>
<svelte:fragment slot="footer">
<FormStyledButton value="Close" on:click={closeCurrentModal} />
<FormStyledButton value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>

View File

@@ -8,6 +8,7 @@
import TextField from '../forms/TextField.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let conid;
export let database;
@@ -26,10 +27,10 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Add key</svelte:fragment>
<svelte:fragment slot="header">{_t('addDbKeyModal.addKey', { defaultMessage: 'Add key' })}</svelte:fragment>
<div class="container">
<FormFieldTemplateLarge label="Key" type="text" noMargin>
<FormFieldTemplateLarge label={_t('addDbKeyModal.key', { defaultMessage: 'Key' })} type="text" noMargin>
<TextField
value={keyName}
on:change={e => {
@@ -41,7 +42,7 @@
<div class="m-3" />
<FormFieldTemplateLarge label="Type" type="combo" noMargin>
<FormFieldTemplateLarge label={_t('addDbKeyModal.type', { defaultMessage: 'Type' })} type="combo" noMargin>
<SelectField
options={driver.supportedKeyTypes.map(t => ({ value: t.name, label: t.label }))}
value={type}
@@ -62,8 +63,8 @@
</div>
<svelte:fragment slot="footer">
<FormStyledButton value="OK" on:click={e => handleSubmit()} />
<FormStyledButton type="button" value="Cancel" on:click={closeCurrentModal} />
<FormStyledButton value={_t('common.ok', { defaultMessage: 'OK' })} on:click={e => handleSubmit()} />
<FormStyledButton type="button" value={_t('common.cancel', { defaultMessage: 'Cancel' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -6,6 +6,7 @@
import FormTextField from '../forms/FormTextField.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let onConfirm;
export let url;
@@ -18,13 +19,13 @@
<FormProvider initialValues={{ url }}>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Download imported file from web</svelte:fragment>
<svelte:fragment slot="header">{_t('changeDownloadUrlModal.header', { defaultMessage: 'Download imported file from web' })}</svelte:fragment>
<FormTextField label="URL" name="url" style={{ width: '30vw' }} focused />
<FormTextField label={_t('changeDownloadUrlModal.urlLabel', { defaultMessage: 'URL' })} name="url" style={{ width: '30vw' }} focused />
<svelte:fragment slot="footer">
<FormSubmit value="OK" on:click={handleSubmit} />
<FormStyledButton value="Cancel" on:click={closeCurrentModal} />
<FormSubmit value={_t('common.ok', { defaultMessage: 'OK' })} on:click={handleSubmit} />
<FormStyledButton value={_t('common.cancel', { defaultMessage: 'Cancel' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -6,6 +6,7 @@
import FormSubmit from '../forms/FormSubmit.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let message = '';
export let onConfirm;
@@ -13,21 +14,21 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Choose archive folder</svelte:fragment>
<svelte:fragment slot="header">{_t('archiveFolderModal.chooseArchiveFolder', { defaultMessage: 'Choose archive folder' })}</svelte:fragment>
<div>{message}</div>
<FormArchiveFolderSelect label="Archive folder" name="archiveFolder" isNative allowCreateNew />
<FormArchiveFolderSelect label={_t('archiveFolderModal.archiveFolder', { defaultMessage: 'Archive folder' })} name="archiveFolder" isNative allowCreateNew />
<svelte:fragment slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
on:click={e => {
closeCurrentModal();
onConfirm(e.detail.archiveFolder);
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -7,6 +7,7 @@
import { useCloudContentList } from '../utility/metadataLoaders';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let message = '';
export let onConfirm;
@@ -18,22 +19,21 @@
{#if $cloudContentList}
<FormProvider initialValues={{ cloudFolder: $cloudContentList?.find(x => x.isPrivate)?.folid }}>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Choose cloud folder</svelte:fragment>
<svelte:fragment slot="header">{_t('cloudFolderModal.chooseCloudFolder', { defaultMessage: 'Choose cloud folder' })}</svelte:fragment>
<div>{message}</div>
<FormCloudFolderSelect label="Cloud folder" name="cloudFolder" isNative {requiredRoleVariants} />
<FormCloudFolderSelect label={_t('cloudFolderModal.cloudFolder', { defaultMessage: 'Cloud folder' })} name="cloudFolder" isNative {requiredRoleVariants} />
<svelte:fragment slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
on:click={e => {
closeCurrentModal();
console.log('onConfirm', e.detail);
onConfirm(e.detail.cloudFolder);
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -11,8 +11,9 @@
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import _ from 'lodash';
import { _t } from '../translations';
export let header = 'Configure columns';
export let header = _t('columnMapModal.configureColumns', { defaultMessage: 'Configure columns' });
export let onConfirm;
export let sourceTableInfo;
@@ -69,7 +70,7 @@
if (!value) return;
if (value.length == 0) return;
if (value.some(x => !x.src || !x.dst)) {
validationError = 'Source and target columns must be defined';
validationError = _t('columnMapModal.sourceAndTargetColumnsMustBeDefined', { defaultMessage: 'Source and target columns must be defined' });
return;
}
const duplicates = _.chain(value.map(x => x.dst))
@@ -78,7 +79,7 @@
.keys()
.value();
if (duplicates.length > 0) {
validationError = 'Target columns must be unique, duplicates found: ' + duplicates.join(', ');
validationError = _t('columnMapModal.targetColumnsMustBeUnique', { defaultMessage: 'Target columns must be unique, duplicates found: ' }) + duplicates.join(', ');
return;
}
}
@@ -95,19 +96,19 @@
{#if resetValue.length == 0}
<div class="m-3">
When no columns are defined in this mapping, source row is copied to target without any modifications
{_t('columnMapModal.noColumnsDefined', { defaultMessage: 'When no columns are defined in this mapping, source row is copied to target without any modifications' })}
</div>
{/if}
<TableControl
columns={[
{ fieldName: 'use', header: 'Use', slot: 4 },
{ fieldName: 'src', header: 'Source column', slot: 1 },
{ fieldName: 'dst', header: 'Target column', slot: 2 },
{ fieldName: 'use', header: _t('columnMapModal.use', { defaultMessage: 'Use' }), slot: 4 },
{ fieldName: 'src', header: _t('columnMapModal.sourceColumn', { defaultMessage: 'Source column' }), slot: 1 },
{ fieldName: 'dst', header: _t('columnMapModal.targetColumn', { defaultMessage: 'Target column' }), slot: 2 },
{ fieldName: 'actions', header: '', slot: 3 },
]}
rows={value || []}
emptyMessage="No transform defined"
emptyMessage={_t('columnMapModal.noTransformDefined', { defaultMessage: 'No transform defined' })}
>
<svelte:fragment slot="4" let:row let:index>
<CheckboxField
@@ -160,14 +161,14 @@
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton
type="button"
value="Add column"
value={_t('columnMapModal.addColumn', { defaultMessage: 'Add column' })}
on:click={() => {
value = [...(value || []), {}];
}}
/>
<FormStyledButton
type="button"
value="Reset"
value={_t('columnMapModal.reset', { defaultMessage: 'Reset' })}
disabled={!differentFromReset}
on:click={() => {
value = resetValue;

View File

@@ -5,17 +5,18 @@
import FormSubmit from '../forms/FormSubmit.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let message;
export let onConfirm;
export let confirmLabel = 'OK';
export let confirmLabel = _t('common.ok', { defaultMessage: 'OK' });
export let header = null;
</script>
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">
{header || 'Confirm'}
{header || _t('common.confirm', { defaultMessage: 'Confirm' })}
</svelte:fragment>
{message}
@@ -31,7 +32,7 @@
/>
<FormStyledButton
type="button"
value="Close"
value={_t('common.close', { defaultMessage: 'Close' })}
on:click={closeCurrentModal}
data-testid="ConfirmModal_closeButton"
/>

View File

@@ -9,6 +9,7 @@
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let script;
export let onConfirm;
@@ -19,7 +20,7 @@
<FormProvider>
<ModalBase {...$$restProps}>
<div slot="header">Save changes</div>
<div slot="header">{_t('common.saveChanges', { defaultMessage: 'Save changes' })}</div>
<div class="editor">
<AceEditor mode="javascript" readOnly value={script} />
@@ -28,7 +29,7 @@
{#if skipConfirmSettingKey}
<div class="mt-2">
<TemplatedCheckboxField
label="Don't ask again"
label={_t('common.dontAskAgain', { defaultMessage: "Don't ask again" })}
templateProps={{ noMargin: true }}
checked={dontAskAgain}
on:change={e => {
@@ -41,16 +42,16 @@
<div slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
on:click={() => {
closeCurrentModal();
onConfirm();
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
<FormStyledButton
type="button"
value="Open script"
value={_t('common.openScript', { defaultMessage: 'Open script' })}
on:click={() => {
newQuery({
initialData: script,

View File

@@ -54,6 +54,7 @@
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal, showModal } from './modalTools';
import { _t } from '../translations';
export let sql;
export let onConfirm;
@@ -81,7 +82,7 @@
<FormProviderCore {values}>
<ModalBase {...$$restProps}>
<div slot="header">Save changes</div>
<div slot="header">{_t('common.saveChanges', { defaultMessage: 'Save changes' })}</div>
<div class="editor">
<SqlEditor {engine} value={currentScript} readOnly />
@@ -91,7 +92,7 @@
<div class="mt-2">
<FormCheckboxField
templateProps={{ noMargin: true }}
label="Delete references CASCADE"
label={_t('sqlModal.deleteReferencesCascade', { defaultMessage: 'Delete references CASCADE' })}
name="deleteReferencesCascade"
data-testid="ConfirmSqlModal_deleteReferencesCascade"
/>
@@ -101,13 +102,13 @@
{#if $values.deleteReferencesCascade}
<div class="form-margin flex">
<FormStyledButton
value="Check all"
value={_t('common.checkAll', { defaultMessage: 'Check all' })}
on:click={() => {
$values = _.omitBy($values, (v, k) => k.startsWith('deleteReferencesFor_'));
}}
/>
<FormStyledButton
value="Uncheck all"
value={_t('common.uncheckAll', { defaultMessage: 'Uncheck all' })}
on:click={() => {
const newValues = { ...$values };
for (const item of deleteCascadesScripts) {
@@ -135,12 +136,11 @@
{#if isRecreated}
<div class="form-margin">
<div>
<FontIcon icon="img warn" /> This operation is not directly supported by SQL engine. DbGate can emulate it, but
please check the generated SQL script.
<FontIcon icon="img warn" /> {_t('sqlModal.recreateWarning', { defaultMessage: "This operation is not directly supported by SQL engine. DbGate can emulate it, but please check the generated SQL script." })}
</div>
<FormCheckboxField
templateProps={{ noMargin: true }}
label="Allow recreate (don't use on production databases)"
label={_t('sqlModal.allowRecreate', { defaultMessage: "Allow recreate (don't use on production databases)" })}
name="allowRecreate"
/>
</div>
@@ -149,7 +149,7 @@
{#if skipConfirmSettingKey}
<div class="mt-2">
<TemplatedCheckboxField
label="Don't ask again"
label={_t('common.dontAskAgain', { defaultMessage: "Don't ask again" })}
templateProps={{ noMargin: true }}
checked={dontAskAgain}
on:change={e => {
@@ -162,7 +162,7 @@
<div slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
disabled={isRecreated && !$values.allowRecreate}
on:click={e => {
closeCurrentModal();
@@ -172,13 +172,13 @@
/>
<FormStyledButton
type="button"
value="Close"
value={_t('common.close', { defaultMessage: 'Close' })}
on:click={closeCurrentModal}
data-testid="ConfirmSqlModal_closeButton"
/>
<FormStyledButton
type="button"
value="Open script"
value={_t('common.openScript', { defaultMessage: 'Open script' })}
on:click={() => {
newQuery({
initialData: currentScript,

View File

@@ -28,6 +28,7 @@
import { callServerPing } from '../utility/connectionsPinger';
import { getConnectionLabel } from 'dbgate-tools';
import { openedConnections } from '../stores';
import { _t } from '../translations';
export let conid;
export let passwordMode;
@@ -125,11 +126,11 @@
<FormProviderCore {values}>
<ModalBase {...$$restProps} simple>
<svelte:fragment slot="header">Database Log In ({engineTitle})</svelte:fragment>
<svelte:fragment slot="header">{_t('databaseLoginModal.header', { defaultMessage: 'Database Log In ({engineTitle})', values: {engineTitle} })}</svelte:fragment>
<FormTextField label="Connection" name="connectionLabel" disabled />
<FormTextField label={_t('databaseLoginModal.connection', { defaultMessage: 'Connection' })} name="connectionLabel" disabled />
<FormTextField
label="Username"
label={_t('databaseLoginModal.username', { defaultMessage: 'Username' })}
name="user"
autocomplete="username"
disabled={usedPasswordMode == 'askPassword'}
@@ -138,7 +139,7 @@
data-testid="DatabaseLoginModal_username"
/>
<FormPasswordField
label="Password"
label={_t('databaseLoginModal.password', { defaultMessage: 'Password' })}
name="password"
autocomplete="current-password"
focused={usedPasswordMode == 'askPassword'}
@@ -148,34 +149,34 @@
{#if isTesting}
<div>
<FontIcon icon="icon loading" /> Testing connection
<FontIcon icon="icon loading" /> {_t('databaseLoginModal.testingConnection', { defaultMessage: 'Testing connection' })}
</div>
{/if}
{#if !isTesting && sqlConnectResult && sqlConnectResult.msgtype == 'error'}
<div class="error-result">
Connect failed: <FontIcon icon="img error" />
{_t('databaseLoginModal.connectFailed', { defaultMessage: 'Connect failed:' })} <FontIcon icon="img error" />
{sqlConnectResult.error}
<Link
onClick={() =>
showModal(ErrorMessageModal, {
message: sqlConnectResult.detail,
showAsCode: true,
title: 'Database connection error',
title: _t('databaseLoginModal.connectionError', { defaultMessage: 'Database connection error' }),
})}
>
Show detail
{_t('databaseLoginModal.showDetail', { defaultMessage: 'Show detail' })}
</Link>
</div>
{/if}
<svelte:fragment slot="footer">
{#if isTesting}
<FormStyledButton value="Stop connecting" on:click={handleCancelTest} data-testid="DatabaseLoginModal_stop" />
<FormStyledButton value={_t('databaseLoginModal.stopConnecting', { defaultMessage: 'Stop connecting' })} on:click={handleCancelTest} data-testid="DatabaseLoginModal_stop" />
{:else}
<FormSubmit value="Connect" on:click={handleSubmit} data-testid="DatabaseLoginModal_connect" />
<FormSubmit value={_t('databaseLoginModal.connect', { defaultMessage: 'Connect' })} on:click={handleSubmit} data-testid="DatabaseLoginModal_connect" />
{/if}
<FormStyledButton value="Close" on:click={closeCurrentModal} data-testid="DatabaseLoginModal_close" />
<FormStyledButton value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} data-testid="DatabaseLoginModal_close" />
</svelte:fragment>
</ModalBase>
</FormProviderCore>

View File

@@ -5,6 +5,7 @@
import FormProvider from '../forms/FormProvider.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let keyInfo;
export let label;
@@ -21,7 +22,7 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Add item</svelte:fragment>
<svelte:fragment slot="header">{_t('dbKeyAddItemModal.header', { defaultMessage: 'Add item' })}</svelte:fragment>
<div class="container">
<DbKeyItemDetail
@@ -34,8 +35,8 @@
</div>
<svelte:fragment slot="footer">
<FormStyledButton value="OK" on:click={e => handleSubmit()} />
<FormStyledButton type="button" value="Cancel" on:click={closeCurrentModal} />
<FormStyledButton value={_t('common.ok', { defaultMessage: 'OK' })} on:click={e => handleSubmit()} />
<FormStyledButton type="button" value={_t('common.cancel', { defaultMessage: 'Cancel' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -21,6 +21,7 @@
import { currentDatabase } from '../stores';
import { filterAppsForDatabase } from '../utility/appTools';
import { apiCall } from '../utility/api';
import { _t } from '../translations';
export let conid;
export let database;
@@ -52,10 +53,10 @@
<FormProviderCore {values}>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Define description</svelte:fragment>
<svelte:fragment slot="header">{_t('defineDictionaryDescriptionModal.header', { defaultMessage: 'Define description' })}</svelte:fragment>
<FormSelectField
label="Target application (mandatory)"
label={_t('defineDictionaryDescriptionModal.targetApplication', { defaultMessage: 'Target application (mandatory)' })}
name="targetApplication"
disableInitialize
selectFieldComponent={TargetApplicationSelect}
@@ -68,8 +69,8 @@
rows={$tableInfo?.columns || []}
columns={[
{ fieldName: 'checked', header: '', slot: 1 },
{ fieldName: 'columnName', header: 'Column' },
{ fieldName: 'dataType', header: 'Data type' },
{ fieldName: 'columnName', header: _t('defineDictionaryDescriptionModal.column', { defaultMessage: 'Column' }) },
{ fieldName: 'dataType', header: _t('defineDictionaryDescriptionModal.dataType', { defaultMessage: 'Data type' }) },
]}
>
<input
@@ -88,15 +89,15 @@
</TableControl>
</div>
<FormTextField name="columns" label="Show columns" />
<FormTextField name="columns" label={_t('defineDictionaryDescriptionModal.showColumns', { defaultMessage: 'Show columns' })} />
<FormTextField name="delimiter" label="Delimiter" />
<FormTextField name="delimiter" label={_t('defineDictionaryDescriptionModal.delimiter', { defaultMessage: 'Delimiter' })} />
<!-- <FormCheckboxField name="useForAllDatabases" label="Use for all databases" /> -->
<svelte:fragment slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
disabled={!checkDescriptionExpression($values?.columns, $tableInfo) || !$values.targetApplication}
on:click={async () => {
closeCurrentModal();
@@ -122,7 +123,7 @@
onConfirm?.();
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
</svelte:fragment>
</ModalBase>
</FormProviderCore>

View File

@@ -15,6 +15,7 @@
import FormTextField from '../forms/FormTextField.svelte';
import _ from 'lodash';
import { apiCall } from '../utility/api';
import { _t } from '../translations';
export let onConfirm;
export let conid;
@@ -126,15 +127,15 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Lookup from {pureName}</svelte:fragment>
<svelte:fragment slot="header">{_t('dictionaryLookupModal.header', { defaultMessage: 'Lookup from {pureName}', values: {pureName} })}</svelte:fragment>
<!-- <FormTextField name="search" label='Search' placeholder="Search" bind:value={search} /> -->
<div class="largeFormMarker">
<SearchInput placeholder="Search" bind:value={search} isDebounced />
<SearchInput placeholder={_t("common.search", { defaultMessage: "Search" })} bind:value={search} isDebounced />
</div>
{#if isLoading}
<LoadingInfo message="Loading data" />
<LoadingInfo message={_t('dictionaryLookupModal.loadingData', { defaultMessage: "Loading data" })} />
{/if}
{#if !isLoading && tableInfo && description && rows && tableInfo?.primaryKey?.columns?.length == 1}
@@ -161,13 +162,13 @@
},
{
fieldName: 'value',
header: 'Value',
header: _t('dictionaryLookupModal.value', { defaultMessage: 'Value' }),
formatter: row => row[tableInfo.primaryKey.columns[0].columnName],
width: '100px',
},
{
fieldName: 'description',
header: 'Description',
header: _t('dictionaryLookupModal.description', { defaultMessage: 'Description' }),
formatter: row => description.columns.map(col => row[col]).join(description.delimiter || ' '),
},
]}
@@ -194,15 +195,15 @@
<svelte:fragment slot="footer">
{#if multiselect}
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
on:click={() => {
closeCurrentModal();
onConfirm(checkedKeys);
}}
/>
{/if}
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value="Customize" on:click={defineDescription} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('dictionaryLookupModal.customize', { defaultMessage: 'Customize' })} on:click={defineDescription} />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -66,7 +66,7 @@
<div slot="footer" class="footer">
<div>
<FormStyledButton
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
title="Ctrl+Enter"
on:click={() => {
onSave(parseCellValue(textValue, dataEditorTypesBehaviour));

View File

@@ -30,11 +30,10 @@
<FormProvider>
<ModalBase {...$$restProps}>
<div slot="header">Edit JSON value</div>
<div slot="header">{_t('editJsonModal.header', { defaultMessage: 'Edit JSON value' })}</div>
{#if showPasteInfo}
<div class="m-2">
Edit JSON object or array. You can paste JSON array or object directly into data grid, new row(s) will be added
to recordset.
{_t('editJsonModal.pasteInfo', { defaultMessage: "Edit JSON object or array. You can paste JSON array or object directly into data grid, new row(s) will be added to recordset." })}
</div>
{/if}

View File

@@ -170,9 +170,9 @@
<div slot="header">
{mode == 'export' ? 'Export' : 'Import'} connections &amp; settings
<span class="check-uncheck">
<Link onClick={() => handleCheckAll(true)}>Check all</Link>
<Link onClick={() => handleCheckAll(true)}>{_t('common.checkAll', { defaultMessage: 'Check all' })}</Link>
|
<Link onClick={() => handleCheckAll(false)}>Uncheck all</Link>
<Link onClick={() => handleCheckAll(false)}>{_t('common.uncheckAll', { defaultMessage: 'Uncheck all' })}</Link>
</span>
</div>

View File

@@ -6,6 +6,7 @@
import FormTextField from '../forms/FormTextField.svelte';
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { _t } from '../translations';
export let value;
export let onConfirm;
@@ -18,24 +19,24 @@
<FormProvider initialValues={{ value }}>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Rows limit</svelte:fragment>
<svelte:fragment slot="header">{_t('query.rowsLimit', { defaultMessage: 'Rows limit' })}</svelte:fragment>
<FormTextField
label="Return only N rows from query"
label={_t('query.returnOnlyNRows', { defaultMessage: 'Return only N rows from query' })}
name="value"
focused
data-testid="RowsLimitModal_value"
placeholder="(No rows limit)"
placeholder={_t('query.noRowsLimit', { defaultMessage: '(No rows limit)' })}
/>
<svelte:fragment slot="footer">
<FormSubmit
value="OK"
value={_t('common.ok', { defaultMessage: 'OK' })}
on:click={e => handleSubmit(parseInt(e.detail.value) || null)}
data-testid="RowsLimitModal_setLimit"
/>
<FormStyledButton value="Set no limit" on:click={e => handleSubmit(null)} data-testid="RowsLimitModal_setNoLimit" />
<FormStyledButton type="button" value="Cancel" on:click={closeCurrentModal} data-testid="RowsLimitModal_cancel" />
<FormStyledButton value={_t('common.setNoLimit', { defaultMessage: 'Set no limit' })} on:click={e => handleSubmit(null)} data-testid="RowsLimitModal_setNoLimit" />
<FormStyledButton type="button" value={_t('common.cancel', { defaultMessage: 'Cancel' })} on:click={closeCurrentModal} data-testid="RowsLimitModal_cancel" />
</svelte:fragment>
</ModalBase>
</FormProvider>

View File

@@ -6,6 +6,7 @@
import { filterName } from 'dbgate-tools';
import InlineButton from '../buttons/InlineButton.svelte';
import FontIcon from '../icons/FontIcon.svelte';
import { _t } from '../translations';
export let items: any[];
export let showProcedure = false;
@@ -49,49 +50,49 @@
}}
>
<FontIcon icon="icon delete" padRight />
Clear
{_t('messageView.clear', { defaultMessage: "Clear" })}
</InlineButton>
{/if}
<RowsFilterSwitcher
icon="img debug"
label="Debug"
label={_t('messageView.debug', { defaultMessage: "Debug" })}
{values}
field="hideDebug"
count={items.filter(x => x.severity == 'debug').length}
/>
<RowsFilterSwitcher
icon="img info"
label="Info"
label={_t('messageView.info', { defaultMessage: "Info" })}
{values}
field="hideInfo"
count={items.filter(x => x.severity == 'info').length}
/>
<RowsFilterSwitcher
icon="img error"
label="Error"
label={_t('messageView.error', { defaultMessage: "Error" })}
{values}
field="hideError"
count={items.filter(x => x.severity == 'error').length}
/>
<SearchInput placeholder="Filter log messages" bind:value={filter} />
<SearchInput placeholder={_t('messageView.filterLogMessages', { defaultMessage: "Filter log messages" })} bind:value={filter} />
</div>
<div class="tablewrap">
<table>
<thead>
<tr>
<td class="header">Number</td>
<td class="header">Message</td>
<td class="header">Time</td>
<td class="header">Delta</td>
<td class="header">Duration</td>
<td class="header">{_t('messageView.number', { defaultMessage: 'Number' })}</td>
<td class="header">{_t('messageView.message', { defaultMessage: 'Message' })}</td>
<td class="header">{_t('messageView.time', { defaultMessage: 'Time' })}</td>
<td class="header">{_t('messageView.delta', { defaultMessage: 'Delta' })}</td>
<td class="header">{_t('messageView.duration', { defaultMessage: 'Duration' })}</td>
{#if showProcedure}
<td class="header">Procedure</td>
<td class="header">{_t('messageView.procedure', { defaultMessage: 'Procedure' })}</td>
{/if}
{#if showLine}
<td class="header">Line</td>
<td class="header">{_t('messageView.line', { defaultMessage: 'Line' })}</td>
{/if}
{#if showCaller}
<td class="header">Caller</td>
<td class="header">{_t('messageView.caller', { defaultMessage: 'Caller' })}</td>
{/if}
</tr>
</thead>

View File

@@ -11,6 +11,7 @@
import AllResultsTab from './AllResultsTab.svelte';
import JslChart from '../charts/JslChart.svelte';
import { isProApp } from '../utility/proTools';
import { __t, _t } from '../translations';
export let tabs = [];
export let sessionId;
@@ -68,7 +69,7 @@
...(oneTab && resultInfos.length > 0
? [
{
label: 'Results',
label: __t('resultTabs.results', { defaultMessage: 'Results' }),
isResult: true,
component: AllResultsTab,
props: {
@@ -77,14 +78,14 @@
},
]
: resultInfos.map((info, index) => ({
label: `Result ${index + 1}`,
label: __t('resultTabs.resultNumber', { defaultMessage: 'Result {number}', values: { number: index + 1 } }),
isResult: true,
component: JslDataGrid,
resultIndex: info.resultIndex,
props: { jslid: info.jslid, driver, onOpenChart: () => handleOpenChart(info.resultIndex) },
}))),
...charts.map((info, index) => ({
label: `Chart ${info.resultIndex + 1}`,
label: __t('resultTabs.chartNumber', { defaultMessage: 'Chart {number}', values: { number: info.resultIndex + 1 } }),
isChart: true,
resultIndex: info.resultIndex,
component: JslChart,
@@ -174,8 +175,8 @@
tabs={allTabs}
menu={resultInfos.length > 0 && [
oneTab
? { text: 'Every result in single tab', onClick: () => setOneTabValue(false) }
: { text: 'All results in one tab', onClick: () => setOneTabValue(true) },
? { text: _t('resultTabs.everyResultInSingleTab', { defaultMessage: 'Every result in single tab' }), onClick: () => setOneTabValue(false) }
: { text: _t('resultTabs.allResultsInOneTab', { defaultMessage: 'All results in one tab' }), onClick: () => setOneTabValue(true) },
]}
onUserChange={value => {
if (allTabs[value].isChart) {

View File

@@ -10,7 +10,7 @@
<div class="wrapper">
<FormValues let:values>
<div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}</div>
<div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default Actions' })}</div>
<FormSelectField
label={_t('settings.defaultActions.connectionClick', { defaultMessage: 'Connection click' })}

View File

@@ -4,7 +4,7 @@
</script>
<div class="wrapper">
<div class="heading">{_t('settings.externalTools', { defaultMessage: 'External tools' })}</div>
<div class="heading">{_t('settings.externalTools', { defaultMessage: 'External Tools' })}</div>
<FormTextField
name="externalTools.mysqldump"
label={_t('settings.other.externalTools.mysqldump', {

View File

@@ -139,7 +139,7 @@ ORDER BY
},
hasPermission('settings/change') && {
identifier: 'external-tools',
label: _t('settings.externalTools', { defaultMessage: 'External tools' }),
label: _t('settings.externalTools', { defaultMessage: 'External Tools' }),
slot: 8,
},
hasPermission('settings/change') && {
@@ -438,10 +438,10 @@ ORDER BY
</svelte:fragment>
<svelte:fragment slot="3">
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Application theme' })}</div>
<div class="heading">{_t('settings.applicationTheme', { defaultMessage: 'Application theme' })}</div>
<FormFieldTemplateLarge
label={_t('settings.appearance.useSystemTheme', { defaultMessage: 'Use system theme' })}
label={_t('settings.applicationTheme.useSystemTheme', { defaultMessage: 'Use system theme' })}
type="checkbox"
labelProps={{
onClick: () => {
@@ -541,7 +541,7 @@ ORDER BY
</div>
</svelte:fragment>
<svelte:fragment slot="4">
<div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}</div>
<div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default Actions' })}</div>
<FormSelectField
label={_t('settings.defaultActions.connectionClick', { defaultMessage: 'Connection click' })}
@@ -775,7 +775,7 @@ ORDER BY
</svelte:fragment>
<svelte:fragment slot="8">
<div class="heading">{_t('settings.externalTools', { defaultMessage: 'External tools' })}</div>
<div class="heading">{_t('settings.externalTools', { defaultMessage: 'External Tools' })}</div>
<FormTextField
name="externalTools.mysqldump"
label={_t('settings.other.externalTools.mysqldump', {

View File

@@ -36,7 +36,7 @@ ORDER BY
</script>
<div class="wrapper">
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Application theme' })}</div>
<div class="heading">{_t('settings.applicationTheme', { defaultMessage: 'Application theme' })}</div>
<FormFieldTemplateLarge
label={_t('settings.appearance.useSystemTheme', { defaultMessage: 'Use system theme' })}

View File

@@ -27,7 +27,7 @@
</script>
<WidgetColumnBar>
<WidgetColumnBarItem title="Public Knowledge Base" name="publicCloud" storageName="publicCloudItems">
<WidgetColumnBarItem title={_t('publicCloudWidget.publicKnowledgeBase', { defaultMessage: "Public Knowledge Base" })} name="publicCloud" storageName="publicCloudItems">
<WidgetsInnerContainer>
<SearchBoxWrapper>
<SearchInput placeholder={_t('publicCloudWidget.searchPublicFiles', { defaultMessage: "Search public files" })} bind:value={filter} />
@@ -49,7 +49,7 @@
/>
{#if !$publicFiles?.length}
<ErrorInfo message="No files found for your configuration" />
<ErrorInfo message={_t('publicCloudWidget.noFilesFound', { defaultMessage: "No files found for your configuration" })} />
<div class="error-info">
<div class="m-1">
{_t('publicCloudWidget.onlyRelevantFilesListed', { defaultMessage: "Only files relevant for your connections, platform and DbGate edition are listed. Please define connections at first." })}