diff --git a/packages/web/src/appobj/AppFileAppObject.svelte b/packages/web/src/appobj/AppFileAppObject.svelte index f3ed7e257..6cb769459 100644 --- a/packages/web/src/appobj/AppFileAppObject.svelte +++ b/packages/web/src/appobj/AppFileAppObject.svelte @@ -53,14 +53,15 @@ import InputTextModal from '../modals/InputTextModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte'; import { apiCall } from '../utility/api'; + import { _t } from '../translations'; export let data; const handleRename = () => { showModal(InputTextModal, { value: data.fileName, - label: 'New file name', - header: 'Rename file', + label: _t('appFile.newFileName', { defaultMessage: 'New file name' }), + header: _t('appFile.renameFile', { defaultMessage: 'Rename file' }), onConfirm: newFile => { apiCall('apps/rename-file', { file: data.fileName, @@ -74,7 +75,7 @@ const handleDelete = () => { showModal(ConfirmModal, { - message: `Really delete file ${data.fileName}?`, + message: _t('appFile.deleteFileConfirm', { defaultMessage: 'Really delete file {fileName}?', values: { fileName: data.fileName } }), onConfirm: () => { apiCall('apps/delete-file', { file: data.fileName, @@ -101,10 +102,10 @@ function createMenu() { return [ - { text: 'Delete', onClick: handleDelete }, - { text: 'Rename', onClick: handleRename }, - data.fileType.endsWith('.sql') && { text: 'Open SQL', onClick: handleOpenSqlFile }, - data.fileType.endsWith('.json') && { text: 'Open JSON', onClick: handleOpenJsonFile }, + { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, + { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, + data.fileType.endsWith('.sql') && { text: _t('common.openSql', { defaultMessage: 'Open SQL' }), onClick: handleOpenSqlFile }, + data.fileType.endsWith('.json') && { text: _t('common.openJson', { defaultMessage: 'Open JSON' }), onClick: handleOpenJsonFile }, // data.fileType.endsWith('.yaml') && { text: 'Open YAML', onClick: handleOpenYamlFile }, ]; diff --git a/packages/web/src/appobj/AppFolderAppObject.svelte b/packages/web/src/appobj/AppFolderAppObject.svelte index 8cbc52a8c..a20bbfd22 100644 --- a/packages/web/src/appobj/AppFolderAppObject.svelte +++ b/packages/web/src/appobj/AppFolderAppObject.svelte @@ -15,6 +15,7 @@ import InputTextModal from '../modals/InputTextModal.svelte'; import { apiCall } from '../utility/api'; import { useConnectionList } from '../utility/metadataLoaders'; + import { _t } from '../translations'; export let data; @@ -34,8 +35,8 @@ showModal(InputTextModal, { value: name, - label: 'New application name', - header: 'Rename application', + label: _t('appFolder.newApplicationName', { defaultMessage: 'New application name' }), + header: _t('appFolder.renameApplication', { defaultMessage: 'Rename application' }), onConfirm: async newFolder => { await apiCall('apps/rename-folder', { folder: data.name, @@ -60,16 +61,16 @@ function createMenu() { return [ - { text: 'Delete', onClick: handleDelete }, - { text: 'Rename', onClick: handleRename }, + { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, + { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, $currentDatabase && [ !isOnCurrentDb($currentDatabase, $connections) && { - text: 'Enable on current database', + text: _t('appFolder.enableOnCurrentDatabase', { defaultMessage: 'Enable on current database' }), onClick: () => setOnCurrentDb(true), }, isOnCurrentDb($currentDatabase, $connections) && { - text: 'Disable on current database', + text: _t('appFolder.disableOnCurrentDatabase', { defaultMessage: 'Disable on current database' }), onClick: () => setOnCurrentDb(false), }, ], @@ -90,7 +91,7 @@ title={data.name} icon={'img app'} statusIcon={isOnCurrentDb($currentDatabase, $connections) ? 'icon check' : null} - statusTitle={`Application ${data.name} is used for database ${$currentDatabase?.name}`} + statusTitle={_t('appFolder.applicationUsedForDatabase', { defaultMessage: 'Application {application} is used for database {database}', values: { application: data.name, database: $currentDatabase?.name } })} isBold={data.name == $currentApplication} on:click={() => ($currentApplication = data.name)} menu={createMenu} diff --git a/packages/web/src/appobj/ArchiveFileAppObject.svelte b/packages/web/src/appobj/ArchiveFileAppObject.svelte index 62f09e66a..ecd17c565 100644 --- a/packages/web/src/appobj/ArchiveFileAppObject.svelte +++ b/packages/web/src/appobj/ArchiveFileAppObject.svelte @@ -82,6 +82,7 @@ import { apiCall } from '../utility/api'; import { openImportExportTab } from '../utility/importExportTools'; import { isProApp } from '../utility/proTools'; + import { _t } from '../translations'; export let data; $: isZipped = data.folderName?.endsWith('.zip'); @@ -89,8 +90,8 @@ const handleRename = () => { showModal(InputTextModal, { value: data.fileName, - label: 'New file name', - header: 'Rename file', + label: _t('archiveFile.newFileName', { defaultMessage: 'New file name' }), + header: _t('archiveFile.renameFile', { defaultMessage: 'Rename file' }), onConfirm: newFile => { apiCall('archive/rename-file', { file: data.fileName, @@ -104,7 +105,7 @@ const handleDelete = () => { showModal(ConfirmModal, { - message: `Really delete file ${data.fileName}?`, + message: _t('archiveFile.deleteFileConfirm', { defaultMessage: 'Really delete file {fileName}?', values: { fileName: data.fileName } }), onConfirm: () => { apiCall('archive/delete-file', { file: data.fileName, @@ -147,10 +148,10 @@ } return [ - data.fileType == 'jsonl' && { text: 'Open', onClick: handleOpenArchive }, - data.fileType == 'jsonl' && { text: 'Open in text editor', onClick: handleOpenJsonLinesText }, - !isZipped && { text: 'Delete', onClick: handleDelete }, - !isZipped && { text: 'Rename', onClick: handleRename }, + data.fileType == 'jsonl' && { text: _t('common.open', { defaultMessage: 'Open' }), onClick: handleOpenArchive }, + data.fileType == 'jsonl' && { text: _t('common.openInTextEditor', { defaultMessage: 'Open in text editor' }), onClick: handleOpenJsonLinesText }, + !isZipped && { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, + !isZipped && { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, data.fileType == 'jsonl' && createQuickExportMenu( fmt => async () => { @@ -185,19 +186,19 @@ }, } ), - data.fileType.endsWith('.sql') && { text: 'Open SQL', onClick: handleOpenSqlFile }, - data.fileType.endsWith('.yaml') && { text: 'Open YAML', onClick: handleOpenYamlFile }, + data.fileType.endsWith('.sql') && { text: _t('common.openSql', { defaultMessage: 'Open SQL' }), onClick: handleOpenSqlFile }, + data.fileType.endsWith('.yaml') && { text: _t('common.openYaml', { defaultMessage: 'Open YAML' }), onClick: handleOpenYamlFile }, !isZipped && isProApp() && data.fileType == 'jsonl' && { - text: 'Open in profiler', + text: _t('common.openInProfiler', { defaultMessage: 'Open in profiler' }), submenu: getExtensions() .drivers.filter(eng => eng.profilerFormatterFunction) .map(eng => ({ text: eng.title, onClick: () => { openNewTab({ - title: 'Profiler', + title: _t('common.profiler', { defaultMessage: 'Profiler' }), icon: 'img profiler', tabComponent: 'ProfilerTab', props: { diff --git a/packages/web/src/appobj/ArchiveFolderAppObject.svelte b/packages/web/src/appobj/ArchiveFolderAppObject.svelte index 3a4f66517..cf0c71dab 100644 --- a/packages/web/src/appobj/ArchiveFolderAppObject.svelte +++ b/packages/web/src/appobj/ArchiveFolderAppObject.svelte @@ -21,14 +21,15 @@ import { isProApp } from '../utility/proTools'; import { extractShellConnection } from '../impexp/createImpExpScript'; import { saveFileToDisk } from '../utility/exportFileTools'; + import { _t } from '../translations'; export let data; const handleDelete = () => { showModal(ConfirmModal, { message: data.name.endsWith('.link') - ? `Really delete link to folder ${data.name}? Folder content remains untouched.` - : `Really delete folder ${data.name}?`, + ? _t('archiveFolder.deleteLinkConfirm', { defaultMessage: 'Really delete link to folder {folderName}? Folder content remains untouched.', values: { folderName: data.name } }) + : _t('archiveFolder.deleteFolderConfirm', { defaultMessage: 'Really delete folder {folderName}?', values: { folderName: data.name } }), onConfirm: () => { apiCall('archive/delete-folder', { folder: data.name }); }, @@ -42,8 +43,8 @@ showModal(InputTextModal, { value: name, - label: 'New folder name', - header: 'Rename folder', + label: _t('archiveFolder.newFolderName', { defaultMessage: 'New folder name' }), + header: _t('archiveFolder.renameFolder', { defaultMessage: 'Rename folder' }), onConfirm: async newFolder => { await apiCall('archive/rename-folder', { folder: data.name, @@ -95,7 +96,7 @@ await dbgateApi.deployDb(${JSON.stringify( const handleCompareWithCurrentDb = () => { openNewTab( { - title: 'Compare', + title: _t('common.compare', { defaultMessage: 'Compare' }), icon: 'img compare', tabComponent: 'CompareModelTab', props: { @@ -153,7 +154,7 @@ await dbgateApi.deployDb(${JSON.stringify( }); }, { - formatLabel: 'ZIP files', + formatLabel: _t('common.zipFiles', { defaultMessage: 'ZIP files' }), formatExtension: 'zip', defaultFileName: data.name?.endsWith('.zip') ? data.name : data.name + '.zip', } @@ -162,28 +163,28 @@ await dbgateApi.deployDb(${JSON.stringify( function createMenu() { return [ - data.name != 'default' && { text: 'Delete', onClick: handleDelete }, - data.name != 'default' && { text: 'Rename', onClick: handleRename }, - isProApp() && { text: 'Data deployer', onClick: handleOpenDataDeployTab }, + data.name != 'default' && { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, + data.name != 'default' && { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, + isProApp() && { text: _t('common.dataDeployer', { defaultMessage: 'Data deployer' }), onClick: handleOpenDataDeployTab }, $currentDatabase && [ - { text: 'Generate deploy DB SQL', onClick: handleGenerateDeploySql }, - hasPermission(`run-shell-script`) && { text: 'Shell: Deploy DB', onClick: handleGenerateDeployScript }, + { text: _t('archiveFolder.generateDeployDbSql', { defaultMessage: 'Generate deploy DB SQL' }), onClick: handleGenerateDeploySql }, + hasPermission(`run-shell-script`) && { text: _t('archiveFolder.shellDeployDb', { defaultMessage: 'Shell: Deploy DB' }), onClick: handleGenerateDeployScript }, ], data.name != 'default' && isProApp() && - data.name.endsWith('.zip') && { text: 'Unpack ZIP', onClick: () => handleZipUnzip('archive/unzip') }, + data.name.endsWith('.zip') && { text: _t('archiveFolder.unpackZip', { defaultMessage: 'Unpack ZIP' }), onClick: () => handleZipUnzip('archive/unzip') }, data.name != 'default' && isProApp() && - !data.name.endsWith('.zip') && { text: 'Pack (create ZIP)', onClick: () => handleZipUnzip('archive/zip') }, + !data.name.endsWith('.zip') && { text: _t('archiveFolder.packZip', { defaultMessage: 'Pack (create ZIP)' }), onClick: () => handleZipUnzip('archive/zip') }, - isProApp() && { text: 'Download ZIP', onClick: handleDownloadZip }, + isProApp() && { text: _t('archiveFolder.downloadZip', { defaultMessage: 'Download ZIP' }), onClick: handleDownloadZip }, data.name != 'default' && hasPermission('dbops/model/compare') && isProApp() && _.get($currentDatabase, 'connection._id') && { onClick: handleCompareWithCurrentDb, - text: `Compare with ${_.get($currentDatabase, 'name')}`, + text: _t('archiveFolder.compareWithCurrentDb', { defaultMessage: 'Compare with {name}', values: { name: _.get($currentDatabase, 'name') } }), }, ]; } diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index a7cd05176..3806272c8 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -407,8 +407,8 @@ await dbgateApi.executeQuery(${JSON.stringify( const handleCreateNewApp = () => { showModal(InputTextModal, { - header: 'New application', - label: 'Application name', + header: _t('database.newApplication', { defaultMessage: 'New application' }), + label: _t('database.applicationName', { defaultMessage: 'Application name' }), value: _.startCase(name), onConfirm: async appName => { const newAppId = await apiCall('apps/create-app-from-db', { diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 6dfc28d17..92892b7d9 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -188,12 +188,12 @@ divider: true, }, hasPermission('dbops/export') && { - label: 'Export', + label: _t('common.export', { defaultMessage: 'Export' }), functionName: 'tableReader', isExport: true, }, hasPermission('dbops/import') && { - label: 'Import', + label: _t('common.import', { defaultMessage: 'Import' }), isImport: true, requiresWriteAccess: true, }, @@ -249,7 +249,7 @@ divider: true, }, { - label: 'Export', + label: _t('common.export', { defaultMessage: 'Export' }), isExport: true, functionName: 'tableReader', }, @@ -299,7 +299,7 @@ divider: true, }, { - label: 'Export', + label: _t('common.export', { defaultMessage: 'Export' }), isExport: true, functionName: 'tableReader', }, @@ -391,7 +391,7 @@ icon: 'img perspective', }, hasPermission('dbops/export') && { - label: 'Export', + label: _t('common.export', { defaultMessage: 'Export' }), isExport: true, functionName: 'tableReader', }, diff --git a/packages/web/src/appobj/SavedFileAppObject.svelte b/packages/web/src/appobj/SavedFileAppObject.svelte index 89776c195..ad98b1eae 100644 --- a/packages/web/src/appobj/SavedFileAppObject.svelte +++ b/packages/web/src/appobj/SavedFileAppObject.svelte @@ -193,6 +193,7 @@ import { saveFileToDisk } from '../utility/exportFileTools'; import { getConnectionInfo } from '../utility/metadataLoaders'; import { showSnackbarError } from '../utility/snackbar'; + import { _t } from '../translations'; export let data; @@ -214,27 +215,26 @@ function createMenu() { return [ - handler?.tabComponent && { text: 'Open', onClick: openTab }, + handler?.tabComponent && { text: _t('common.open', { defaultMessage: 'Open' }), onClick: openTab }, - !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: 'Rename', onClick: handleRename }, - !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: 'Create copy', onClick: handleCopy }, - !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: 'Delete', onClick: handleDelete }, - - data.teamFileId && data.allowWrite && { text: 'Rename', onClick: handleRename }, + !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, + !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: _t('common.createCopy', { defaultMessage: 'Create copy' }), onClick: handleCopy }, + !data.teamFileId && hasPermission(`files/${data.folder}/write`) && { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, + data.teamFileId && data.allowWrite && { text: _t('common.rename', { defaultMessage: 'Rename' }), onClick: handleRename }, data.teamFileId && data.allowRead && - hasPermission('all-team-files/create') && { text: 'Create copy', onClick: handleCopy }, - data.teamFileId && data.allowWrite && { text: 'Delete', onClick: handleDelete }, + hasPermission('all-team-files/create') && { text: _t('common.createCopy', { defaultMessage: 'Create copy' }), onClick: handleCopy }, + data.teamFileId && data.allowWrite && { text: _t('common.delete', { defaultMessage: 'Delete' }), onClick: handleDelete }, - folder == 'markdown' && { text: 'Show page', onClick: showMarkdownPage }, - !data.teamFileId && { text: 'Download', onClick: handleDownload }, - data.teamFileId && data.allowRead && { text: 'Download', onClick: handleDownload }, + folder == 'markdown' && { text: _t('common.showPage', { defaultMessage: 'Show page' }), onClick: showMarkdownPage }, + !data.teamFileId && { text: _t('common.download', { defaultMessage: 'Download' }), onClick: handleDownload }, + data.teamFileId && data.allowRead && { text: _t('common.download', { defaultMessage: 'Download' }), onClick: handleDownload }, ]; } const handleDelete = () => { showModal(ConfirmModal, { - message: `Really delete file ${data.file}?`, + message: _t('common.reallyDeleteFile', { defaultMessage: 'Really delete file {file}?', values: { file: data.file } }), onConfirm: () => { if (data.teamFileId) { apiCall('team-files/delete', { teamFileId: data.teamFileId }); @@ -253,8 +253,8 @@ const handleRename = () => { showModal(InputTextModal, { value: data.file, - label: 'New file name', - header: 'Rename file', + label: _t('common.newFileName', { defaultMessage: 'New file name' }), + header: _t('common.renameFile', { defaultMessage: 'Rename file' }), onConfirm: newFile => { if (data.teamFileId) { apiCall('team-files/update', { teamFileId: data.teamFileId, name: newFile }); @@ -274,8 +274,8 @@ const handleCopy = () => { showModal(InputTextModal, { value: data.file, - label: 'New file name', - header: 'Copy file', + label: _t('savedFile.newFileName', { defaultMessage: 'New file name' }), + header: _t('savedFile.copyFile', { defaultMessage: 'Copy file' }), onConfirm: newFile => { if (data.teamFileId) { apiCall('team-files/copy', { teamFileId: data.teamFileId, newName: newFile }); @@ -323,12 +323,12 @@ if (data.teamFileId) { if (data?.metadata?.autoExecute) { if (!data.allowUse) { - showSnackbarError('You do not have permission to use this team file'); + showSnackbarError(_t('savedFile.noPermissionUseTeamFile', { defaultMessage: 'You do not have permission to use this team file' })); return; } } else { if (!data.allowRead) { - showSnackbarError('You do not have permission to read this team file'); + showSnackbarError(_t('savedFile.noPermissionReadTeamFile', { defaultMessage: 'You do not have permission to read this team file' })); return; } } diff --git a/packages/web/src/commands/CommandPalette.svelte b/packages/web/src/commands/CommandPalette.svelte index 789f3c909..efecfcb38 100644 --- a/packages/web/src/commands/CommandPalette.svelte +++ b/packages/web/src/commands/CommandPalette.svelte @@ -201,7 +201,7 @@ bind:this={domInput} bind:value={filter} on:keydown={handleKeyDown} - placeholder={parentCommand?.text || + placeholder={_tval(parentCommand?.text) || ($visibleCommandPalette == 'database' ? _t('commandPalette.searchInDatabase', { defaultMessage: 'Search in database' }) : _t('commandPalette.searchInCommands', { defaultMessage: 'Search in commands' }))} /> diff --git a/packages/web/src/datagrid/SqlDataGridCore.svelte b/packages/web/src/datagrid/SqlDataGridCore.svelte index 8db47f4fe..851e6f5a3 100644 --- a/packages/web/src/datagrid/SqlDataGridCore.svelte +++ b/packages/web/src/datagrid/SqlDataGridCore.svelte @@ -1,5 +1,5 @@