From 8e640722c62692818ab840d50b3758f89a41a54e Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Wed, 25 Nov 2015 16:48:41 -0500 Subject: Imported Upstream version 3.0.7 --- Plugins/ConfigMigration/ConfigMigration.pro | 4 +- Plugins/ConfigMigration/ConfigMigration_it.ts | 150 + Plugins/CsvExport/CsvExport.pro | 4 +- Plugins/CsvExport/CsvExport_it.ts | 57 + Plugins/CsvExport/CsvExport_zh_CN.ts | 20 +- Plugins/CsvImport/CsvImport.pro | 4 +- Plugins/CsvImport/CsvImport_it.ts | 85 + Plugins/DbAndroid/DbAndroid.pro | 53 + Plugins/DbAndroid/adbmanager.cpp | 426 ++ Plugins/DbAndroid/adbmanager.h | 65 + Plugins/DbAndroid/dbandroid.cpp | 209 + Plugins/DbAndroid/dbandroid.h | 63 + Plugins/DbAndroid/dbandroid.json | 9 + Plugins/DbAndroid/dbandroid.qrc | 1 + Plugins/DbAndroid/dbandroid_global.h | 12 + Plugins/DbAndroid/dbandroidconnection.cpp | 14 + Plugins/DbAndroid/dbandroidconnection.h | 44 + Plugins/DbAndroid/dbandroidconnectionfactory.cpp | 28 + Plugins/DbAndroid/dbandroidconnectionfactory.h | 21 + Plugins/DbAndroid/dbandroidinstance.cpp | 143 + Plugins/DbAndroid/dbandroidinstance.h | 51 + Plugins/DbAndroid/dbandroidjsonconnection.cpp | 430 ++ Plugins/DbAndroid/dbandroidjsonconnection.h | 65 + Plugins/DbAndroid/dbandroidmode.h | 13 + Plugins/DbAndroid/dbandroidpathdialog.cpp | 579 ++ Plugins/DbAndroid/dbandroidpathdialog.h | 80 + Plugins/DbAndroid/dbandroidpathdialog.ui | 244 + Plugins/DbAndroid/dbandroidshellconnection.cpp | 363 ++ Plugins/DbAndroid/dbandroidshellconnection.h | 59 + Plugins/DbAndroid/dbandroidurl.cpp | 217 + Plugins/DbAndroid/dbandroidurl.h | 59 + Plugins/DbAndroid/sqlqueryandroid.cpp | 160 + Plugins/DbAndroid/sqlqueryandroid.h | 47 + Plugins/DbAndroid/sqlresultrowandroid.cpp | 12 + Plugins/DbAndroid/sqlresultrowandroid.h | 13 + Plugins/DbSqlite2/DbSqlite2.pro | 1 + Plugins/HtmlExport/HtmlExport.pro | 4 +- Plugins/HtmlExport/HtmlExport_it.ts | 173 + Plugins/JsonExport/JsonExport.pro | 4 +- Plugins/JsonExport/JsonExport_it.ts | 22 + Plugins/JsonExport/JsonExport_zh_CN.ts | 6 +- Plugins/PdfExport/PdfExport.pro | 4 +- Plugins/PdfExport/PdfExport_de.ts | 96 +- Plugins/PdfExport/PdfExport_it.ts | 256 + Plugins/Plugins.pro | 3 +- Plugins/Printing/Printing.pro | 4 +- Plugins/Printing/Printing_de.ts | 12 +- Plugins/Printing/Printing_it.ts | 40 + Plugins/Printing/Printing_zh_CN.ts | 12 +- Plugins/RegExpImport/RegExpImport.pro | 4 +- Plugins/RegExpImport/RegExpImport_it.ts | 83 + Plugins/ScriptingTcl/ScriptingTcl.pro | 8 +- Plugins/ScriptingTcl/ScriptingTcl_it.ts | 22 + .../SqlEnterpriseFormatter.pro | 4 +- .../SqlEnterpriseFormatter_de.ts | 31 +- .../SqlEnterpriseFormatter_es.ts | 31 +- .../SqlEnterpriseFormatter_fr.ts | 31 +- .../SqlEnterpriseFormatter_it.ts | 233 + .../SqlEnterpriseFormatter_pl.ts | 31 +- .../SqlEnterpriseFormatter_pt_BR.ts | 31 +- .../SqlEnterpriseFormatter_ru.ts | 33 +- .../SqlEnterpriseFormatter_sk.ts | 31 +- .../SqlEnterpriseFormatter_zh_CN.ts | 31 +- Plugins/SqlEnterpriseFormatter/formatempty.cpp | 5 +- Plugins/SqlEnterpriseFormatter/formatempty.h | 3 - .../sqlenterpriseformatter.cpp | 206 +- .../sqlenterpriseformatter.h | 23 + .../sqlenterpriseformatter.ui | 69 +- Plugins/SqlExport/SqlExport.pro | 4 +- Plugins/SqlExport/SqlExport_it.ts | 98 + Plugins/SqlExport/SqlExport_zh_CN.ts | 14 +- Plugins/SqlFormatterSimple/SqlFormatterSimple.pro | 4 +- .../SqlFormatterSimple/SqlFormatterSimple_it.ts | 17 + .../SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts | 4 +- Plugins/XmlExport/XmlExport.pro | 4 +- Plugins/XmlExport/XmlExport_it.ts | 70 + SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp | 11 + SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt | 9 + SQLiteStudio3/coreSQLiteStudio/TODO.txt | 12 + .../coreSQLiteStudio/common/utils_sql.cpp | 13 + SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h | 2 + .../coreSQLiteStudio/coreSQLiteStudio.pro | 4 +- .../coreSQLiteStudio/db/queryexecutor.cpp | 19 +- SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h | 5 + .../queryexecutorsteps/queryexecutoraddrowids.cpp | 14 +- .../db/queryexecutorsteps/queryexecutoraddrowids.h | 2 +- SQLiteStudio3/coreSQLiteStudio/parser/lempar.c | 6 +- .../coreSQLiteStudio/parser/sqlite2_parse.cpp | 6 +- .../coreSQLiteStudio/parser/sqlite3_parse.cpp | 6 +- SQLiteStudio3/coreSQLiteStudio/parser/token.cpp | 8 +- SQLiteStudio3/coreSQLiteStudio/parser/token.h | 4 +- SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp | 2 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp | 59 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.h | 4 + .../translations/coreSQLiteStudio_de.ts | 488 +- .../translations/coreSQLiteStudio_es.ts | 32 +- .../translations/coreSQLiteStudio_fr.ts | 32 +- .../translations/coreSQLiteStudio_it.ts | 1283 ++++ .../translations/coreSQLiteStudio_pl.ts | 4 +- .../translations/coreSQLiteStudio_pt_BR.ts | 32 +- .../translations/coreSQLiteStudio_ru.ts | 34 +- .../translations/coreSQLiteStudio_sk.ts | 50 +- .../translations/coreSQLiteStudio_zh_CN.ts | 34 +- SQLiteStudio3/create_source_dist.sh | 7 +- SQLiteStudio3/create_win32_portable.bat | 2 +- .../guiSQLiteStudio/common/tablewidget.cpp | 1 + .../datagrid/sqlqueryitemdelegate.cpp | 173 + .../datagrid/sqlqueryitemdelegate.h | 10 + .../guiSQLiteStudio/datagrid/sqlquerymodel.cpp | 11 + .../guiSQLiteStudio/datagrid/sqlquerymodel.h | 4 + .../guiSQLiteStudio/datagrid/sqlqueryview.cpp | 75 +- .../guiSQLiteStudio/datagrid/sqlqueryview.h | 3 + SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro | 4 +- SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp | 13 + SQLiteStudio3/guiSQLiteStudio/mainwindow.h | 1 + SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp | 7 +- SQLiteStudio3/guiSQLiteStudio/sqleditor.h | 2 + .../translations/guiSQLiteStudio_de.ts | 1915 +++--- .../translations/guiSQLiteStudio_es.ts | 511 +- .../translations/guiSQLiteStudio_fr.ts | 511 +- .../translations/guiSQLiteStudio_it.ts | 6154 ++++++++++++++++++++ .../translations/guiSQLiteStudio_pl.ts | 511 +- .../translations/guiSQLiteStudio_pt_BR.ts | 511 +- .../translations/guiSQLiteStudio_ru.ts | 511 +- .../translations/guiSQLiteStudio_sk.ts | 86 +- .../translations/guiSQLiteStudio_zh_CN.ts | 1096 ++-- .../guiSQLiteStudio/windows/tablewindow.cpp | 1 + SQLiteStudio3/sqlitestudio/sqlitestudio.pro | 4 +- .../sqlitestudio/translations/sqlitestudio_de.ts | 28 +- .../sqlitestudio/translations/sqlitestudio_it.ts | 73 + .../sqlitestudio/translations/sqlitestudio_ru.ts | 2 +- .../translations/sqlitestudio_zh_CN.ts | 12 +- SQLiteStudio3/sqlitestudiocli/cli.cpp | 29 + SQLiteStudio3/sqlitestudiocli/cli.h | 10 +- .../sqlitestudiocli/clicommandexecutor.cpp | 4 +- .../sqlitestudiocli/commands/clicommanddesc.cpp | 94 + .../sqlitestudiocli/commands/clicommanddesc.h | 8 + .../sqlitestudiocli/commands/clicommanduse.cpp | 2 +- SQLiteStudio3/sqlitestudiocli/main.cpp | 5 +- SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.pro | 4 +- .../translations/sqlitestudiocli_de.ts | 68 +- .../translations/sqlitestudiocli_es.ts | 68 +- .../translations/sqlitestudiocli_fr.ts | 70 +- .../translations/sqlitestudiocli_it.ts | 788 +++ .../translations/sqlitestudiocli_pl.ts | 44 + .../translations/sqlitestudiocli_pt_BR.ts | 68 +- .../translations/sqlitestudiocli_ru.ts | 72 +- .../translations/sqlitestudiocli_sk.ts | 68 +- .../translations/sqlitestudiocli_zh_CN.ts | 100 +- 149 files changed, 18183 insertions(+), 3299 deletions(-) create mode 100644 Plugins/ConfigMigration/ConfigMigration_it.ts create mode 100644 Plugins/CsvExport/CsvExport_it.ts create mode 100644 Plugins/CsvImport/CsvImport_it.ts create mode 100644 Plugins/DbAndroid/DbAndroid.pro create mode 100644 Plugins/DbAndroid/adbmanager.cpp create mode 100644 Plugins/DbAndroid/adbmanager.h create mode 100644 Plugins/DbAndroid/dbandroid.cpp create mode 100644 Plugins/DbAndroid/dbandroid.h create mode 100644 Plugins/DbAndroid/dbandroid.json create mode 100644 Plugins/DbAndroid/dbandroid.qrc create mode 100644 Plugins/DbAndroid/dbandroid_global.h create mode 100644 Plugins/DbAndroid/dbandroidconnection.cpp create mode 100644 Plugins/DbAndroid/dbandroidconnection.h create mode 100644 Plugins/DbAndroid/dbandroidconnectionfactory.cpp create mode 100644 Plugins/DbAndroid/dbandroidconnectionfactory.h create mode 100644 Plugins/DbAndroid/dbandroidinstance.cpp create mode 100644 Plugins/DbAndroid/dbandroidinstance.h create mode 100644 Plugins/DbAndroid/dbandroidjsonconnection.cpp create mode 100644 Plugins/DbAndroid/dbandroidjsonconnection.h create mode 100644 Plugins/DbAndroid/dbandroidmode.h create mode 100644 Plugins/DbAndroid/dbandroidpathdialog.cpp create mode 100644 Plugins/DbAndroid/dbandroidpathdialog.h create mode 100644 Plugins/DbAndroid/dbandroidpathdialog.ui create mode 100644 Plugins/DbAndroid/dbandroidshellconnection.cpp create mode 100644 Plugins/DbAndroid/dbandroidshellconnection.h create mode 100644 Plugins/DbAndroid/dbandroidurl.cpp create mode 100644 Plugins/DbAndroid/dbandroidurl.h create mode 100644 Plugins/DbAndroid/sqlqueryandroid.cpp create mode 100644 Plugins/DbAndroid/sqlqueryandroid.h create mode 100644 Plugins/DbAndroid/sqlresultrowandroid.cpp create mode 100644 Plugins/DbAndroid/sqlresultrowandroid.h create mode 100644 Plugins/HtmlExport/HtmlExport_it.ts create mode 100644 Plugins/JsonExport/JsonExport_it.ts create mode 100644 Plugins/PdfExport/PdfExport_it.ts create mode 100644 Plugins/Printing/Printing_it.ts create mode 100644 Plugins/RegExpImport/RegExpImport_it.ts create mode 100644 Plugins/ScriptingTcl/ScriptingTcl_it.ts create mode 100644 Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_it.ts create mode 100644 Plugins/SqlExport/SqlExport_it.ts create mode 100644 Plugins/SqlFormatterSimple/SqlFormatterSimple_it.ts create mode 100644 Plugins/XmlExport/XmlExport_it.ts create mode 100644 SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts create mode 100644 SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts create mode 100644 SQLiteStudio3/sqlitestudio/translations/sqlitestudio_it.ts create mode 100644 SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_it.ts diff --git a/Plugins/ConfigMigration/ConfigMigration.pro b/Plugins/ConfigMigration/ConfigMigration.pro index 8983b8d..52eeaec 100644 --- a/Plugins/ConfigMigration/ConfigMigration.pro +++ b/Plugins/ConfigMigration/ConfigMigration.pro @@ -31,7 +31,8 @@ RESOURCES += \ configmigration.qrc -TRANSLATIONS += ConfigMigration_zh_CN.ts \ +TRANSLATIONS += ConfigMigration_it.ts \ + ConfigMigration_zh_CN.ts \ ConfigMigration_sk.ts \ ConfigMigration_de.ts \ ConfigMigration_ru.ts \ @@ -51,3 +52,4 @@ TRANSLATIONS += ConfigMigration_zh_CN.ts \ + diff --git a/Plugins/ConfigMigration/ConfigMigration_it.ts b/Plugins/ConfigMigration/ConfigMigration_it.ts new file mode 100644 index 0000000..c71c354 --- /dev/null +++ b/Plugins/ConfigMigration/ConfigMigration_it.ts @@ -0,0 +1,150 @@ + + + + + ConfigMigration + + + A configuration from old SQLiteStudio 2.x.x has been detected. Would you like to migrate old settings into the current version? <a href="%1">Click here to do that</a>. + + + + + Bug reports history (%1) + + + + + Database list (%1) + + + + + Custom SQL functions (%1) + + + + + SQL queries history (%1) + + + + + ConfigMigrationWizard + + + Configuration migration + + + + + Items to migrate + + + + + This is a list of items found in the old configuration file, which can be migrated into the current configuration. + + + + + Options + + + + + Put imported databases into separate group + + + + + Group name + + + + + Enter a non-empty name. + + + + + Top level group named '%1' already exists. Enter a group name that does not exist yet. + + + + + Could not open old configuration file in order to migrate settings from it. + + + + + Could not open current configuration file in order to migrate settings from old configuration file. + + + + + Could not commit migrated data into new configuration file: %1 + + + + + Could not read bug reports history from old configuration file in order to migrate it: %1 + + + + + Could not insert a bug reports history entry into new configuration file: %1 + + + + + Could not read database list from old configuration file in order to migrate it: %1 + + + + + Could not query for available order for containing group in new configuration file in order to migrate the database list: %1 + + + + + Could not create containing group in new configuration file in order to migrate the database list: %1 + + + + + Could not insert a database entry into new configuration file: %1 + + + + + Could not query for available order for next database in new configuration file in order to migrate the database list: %1 + + + + + Could not create group referencing the database in new configuration file: %1 + + + + + Could not read function list from old configuration file in order to migrate it: %1 + + + + + Could not read SQL queries history from old configuration file in order to migrate it: %1 + + + + + Could not read next ID for SQL queries history in new configuration file: %1 + + + + + Could not insert SQL history entry into new configuration file: %1 + + + + diff --git a/Plugins/CsvExport/CsvExport.pro b/Plugins/CsvExport/CsvExport.pro index 1599a13..9e509b2 100644 --- a/Plugins/CsvExport/CsvExport.pro +++ b/Plugins/CsvExport/CsvExport.pro @@ -29,7 +29,8 @@ RESOURCES += \ -TRANSLATIONS += CsvExport_zh_CN.ts \ +TRANSLATIONS += CsvExport_it.ts \ + CsvExport_zh_CN.ts \ CsvExport_sk.ts \ CsvExport_de.ts \ CsvExport_ru.ts \ @@ -49,3 +50,4 @@ TRANSLATIONS += CsvExport_zh_CN.ts \ + diff --git a/Plugins/CsvExport/CsvExport_it.ts b/Plugins/CsvExport/CsvExport_it.ts new file mode 100644 index 0000000..30f4907 --- /dev/null +++ b/Plugins/CsvExport/CsvExport_it.ts @@ -0,0 +1,57 @@ + + + + + CsvExport + + + Column names in first row + + + + + Column separator: + + + + + , (comma) + + + + + ; (semicolon) + + + + + \t (tab) + + + + + (whitespace) + + + + + Custom: + + + + + Export NULL values as: + + + + + Empty string + + + + + Enter the custom separator character. + + + + diff --git a/Plugins/CsvExport/CsvExport_zh_CN.ts b/Plugins/CsvExport/CsvExport_zh_CN.ts index e73fe4e..6d31621 100644 --- a/Plugins/CsvExport/CsvExport_zh_CN.ts +++ b/Plugins/CsvExport/CsvExport_zh_CN.ts @@ -6,52 +6,52 @@ Column names in first row - + 第一行显示列名 Column separator: - + 列分隔符: , (comma) - + ,(逗号) ; (semicolon) - + ;(分号) \t (tab) - + \t(tab位) (whitespace) - + (空格) Custom: - + 自定义: Export NULL values as: - + NULL导出为: Empty string - + 空字符串 Enter the custom separator character. - + 输入自定义分隔符 。 diff --git a/Plugins/CsvImport/CsvImport.pro b/Plugins/CsvImport/CsvImport.pro index 6ce08d1..7e8dce0 100644 --- a/Plugins/CsvImport/CsvImport.pro +++ b/Plugins/CsvImport/CsvImport.pro @@ -28,7 +28,8 @@ RESOURCES += \ csvimport.qrc -TRANSLATIONS += CsvImport_zh_CN.ts \ +TRANSLATIONS += CsvImport_it.ts \ + CsvImport_zh_CN.ts \ CsvImport_sk.ts \ CsvImport_de.ts \ CsvImport_ru.ts \ @@ -48,3 +49,4 @@ TRANSLATIONS += CsvImport_zh_CN.ts \ + diff --git a/Plugins/CsvImport/CsvImport_it.ts b/Plugins/CsvImport/CsvImport_it.ts new file mode 100644 index 0000000..bc60d95 --- /dev/null +++ b/Plugins/CsvImport/CsvImport_it.ts @@ -0,0 +1,85 @@ + + + + + CsvImport + + + Cannot read file %1 + + + + + Could not find any data in the file %1. + + + + + Enter the custom separator character. + + + + + Enter the value that will be interpreted as a NULL. + + + + + CSV files (*.csv);;Text files (*.txt);;All files (*) + + + + + csvImportOptions + + + , (comma) + + + + + ; (semicolon) + + + + + \t (tab) + + + + + (whitespace) + + + + + Custom: + + + + + <p>Enable this if the first data line in your CSV file represents column names. You don't want column names to be imported into the table as a regular data.</p> + + + + + First line represents CSV column names + + + + + Field separator: + + + + + NULL values: + + + + + If your CSV data contains null values, define how are they represented in the CSV. + + + + diff --git a/Plugins/DbAndroid/DbAndroid.pro b/Plugins/DbAndroid/DbAndroid.pro new file mode 100644 index 0000000..2895c7f --- /dev/null +++ b/Plugins/DbAndroid/DbAndroid.pro @@ -0,0 +1,53 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-01-04T19:37:23 +# +#------------------------------------------------- + +QT += widgets network + +include($$PWD/../../../sqlitestudio/SQLiteStudio3/plugins.pri) + +TARGET = DbAndroid +TEMPLATE = lib + +DEFINES += DBANDROID_LIBRARY + +SOURCES += dbandroid.cpp \ + dbandroidinstance.cpp \ + sqlqueryandroid.cpp \ + dbandroidurl.cpp \ + dbandroidpathdialog.cpp \ + adbmanager.cpp \ + sqlresultrowandroid.cpp \ + dbandroidjsonconnection.cpp \ + dbandroidshellconnection.cpp \ + dbandroidconnection.cpp \ + dbandroidconnectionfactory.cpp + +HEADERS += dbandroid.h\ + dbandroid_global.h \ + dbandroidinstance.h \ + sqlqueryandroid.h \ + dbandroidurl.h \ + dbandroidpathdialog.h \ + adbmanager.h \ + dbandroidconnection.h \ + dbandroidmode.h \ + sqlresultrowandroid.h \ + dbandroidjsonconnection.h \ + dbandroidshellconnection.h \ + dbandroidconnectionfactory.h + +win32: { + LIBS += -lcoreSQLiteStudio -lguiSQLiteStudio +} + +DISTFILES += \ + dbandroid.json + +FORMS += \ + dbandroidpathdialog.ui + +RESOURCES += \ + dbandroid.qrc diff --git a/Plugins/DbAndroid/adbmanager.cpp b/Plugins/DbAndroid/adbmanager.cpp new file mode 100644 index 0000000..ed012a1 --- /dev/null +++ b/Plugins/DbAndroid/adbmanager.cpp @@ -0,0 +1,426 @@ +#include "adbmanager.h" +#include "dbandroid.h" +#include "common/utils.h" +#include +#include +#include +#include + +AdbManager::AdbManager(DbAndroid* dbAndroidPlugin) : + QObject(dbAndroidPlugin), plugin(dbAndroidPlugin) +{ + connect(this, SIGNAL(internalDeviceListUpdate(QStringList)), this, SLOT(handleNewDeviceList(QStringList))); + connect(this, SIGNAL(deviceDetailsChanged(QList)), this, SLOT(handleNewDetails(QList))); + + adbRunMonitor = new QTimer(this); + connect(adbRunMonitor, SIGNAL(timeout()), this, SLOT(updateDeviceList())); + adbRunMonitor->setSingleShot(false); + adbRunMonitor->setInterval(1000); + adbRunMonitor->start(); + updateDeviceList(); +} + +AdbManager::~AdbManager() +{ + adbRunMonitor->stop(); + updateDevicesFuture.waitForFinished(); +} + +const QStringList& AdbManager::getDevices(bool forceSyncUpdate) +{ + if (forceSyncUpdate) + syncDeviceListUpdate(); + + return currentDeviceList; +} + +AdbManager::Device AdbManager::getDetails(const QString& deviceId) +{ + if (!currentDeviceDetails.contains(deviceId)) + { + AdbManager::Device device; + device.id = deviceId; + return device; + } + + return currentDeviceDetails[deviceId]; +} + +QList AdbManager::getDeviceDetails() +{ + return currentDeviceDetails.values(); +} + +QHash> AdbManager::getForwards() +{ + QHash> forwards; + QString stdOut; + if (!exec(QStringList({"forward", "--list"}), &stdOut)) + return forwards; + + QRegularExpression re("(.*)\\s+tcp:(\\d+)\\s+tcp:(\\d+)"); + QRegularExpressionMatch match; + QPair forward; + QStringList lines = stdOut.split("\n"); + for (const QString& line : lines) + { + match = re.match(line); + if (!match.hasMatch()) + continue; + + forward.first = match.captured(2).toInt(); + forward.second = match.captured(3).toInt(); + forwards[match.captured(1)] = forward; + } + + return forwards; +} + +int AdbManager::makeForwardFor(const QString& device, int targetPort) +{ + static_qstring(portTpl, "tcp:%1"); + + QHash> forwards = getForwards(); + if (forwards.contains(device) && forwards[device].second == targetPort) + return forwards[device].first; + + int localPort = targetPort; + QStringList args = QStringList({"-s", device, "forward"}); + args << portTpl.arg(localPort); + args << portTpl.arg(targetPort); + + int tryCount = 0; + QString stdOut; + bool res; + while (!(res = exec(args, &stdOut)) && tryCount++ < 3) + { + localPort = rand(1025, 65000); + args.replace(3, portTpl.arg(localPort)); + } + + if (!res) + return -1; + + return localPort; +} + +QString AdbManager::findAdb() +{ + QStringList candidates; +#ifdef Q_OS_WIN32 + candidates << "adb.exe"; +#endif + +#ifdef Q_OS_MACX + candidates << (QDir::homePath() + "/Library/Android/sdk/platform-tools/adb"); +#endif + +#ifdef Q_OS_UNIX + candidates << "adb" << "./adb"; + + QProcess locate; + locate.start("locate", QStringList({"adb"})); + if (waitForProc(locate, true)) + { + QFileInfo fi; + QStringList locateLines = decode(locate.readAllStandardOutput()).split("\n"); + for (const QString& filePath : locateLines) + { + fi.setFile(filePath); + if (fi.fileName() != "adb" || !fi.isReadable() || !fi.isExecutable()) + continue; + + candidates << filePath; + } + } +#endif + +#ifdef Q_OS_WIN32 + if (testAdb("adb.exe", true)) + return "adb.exe"; + + static_qstring(winAdbPath, "/../Android/sdk/platform-tools/adb.exe"); + QString fullPath; + for (const QString& path : QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation)) + { + fullPath = QDir::cleanPath(path + winAdbPath); + if (testAdb(fullPath, true)) + return fullPath; + } +#endif + + return QString(); +} + +bool AdbManager::testCurrentAdb() +{ + return testAdb(plugin->getCurrentAdb(), false); +} + +bool AdbManager::testAdb(const QString& adbPath, bool quiet) +{ + if (adbPath.isEmpty()) + return false; + + QProcess adbApp; + adbApp.start(adbPath, QStringList({"version"})); + if (!waitForProc(adbApp, quiet)) + return false; + + QString verStr = decode(adbApp.readAllStandardOutput()); + bool res = verStr.startsWith("Android Debug Bridge", Qt::CaseInsensitive); + if (!res && !quiet) + qWarning() << "Adb binary correct, but its version string is incorrect:" << verStr; + + return res; +} + +bool AdbManager::execBytes(const QStringList& arguments, QByteArray* stdOut, QByteArray* stdErr) +{ + if (!ensureAdbRunning()) + return false; + + QProcess proc; + if (arguments.join(" ").size() > 800) + { + if (!execLongCommand(arguments, proc, stdErr)) + return false; + } + else + { + proc.start(plugin->getCurrentAdb(), arguments); + if (!waitForProc(proc, false)) + return false; + } + + if (stdOut) + *stdOut = proc.readAllStandardOutput(); + + if (stdErr) + *stdErr = proc.readAllStandardError(); + + return true; +} + +bool AdbManager::waitForProc(QProcess& proc, bool quiet) +{ + if (!proc.waitForFinished(-1)) + { + if (!quiet) + qDebug() << "DbAndroid QProcess timed out."; + + return false; + } + + if (proc.exitStatus() == QProcess::CrashExit) + { + if (!quiet) + { + qDebug() << "DbAndroid QProcess finished by crashing."; + qDebug() << proc.readAllStandardOutput() << proc.readAllStandardError(); + } + + return false; + } + + if (proc.exitCode() != 0) + { + if (!quiet) + { + qDebug() << "DbAndroid QProcess finished with code:" << proc.exitCode(); + qDebug() << proc.readAllStandardOutput() << proc.readAllStandardError(); + } + + return false; + } + + return true; +} + +bool AdbManager::ensureAdbRunning() +{ + if (!plugin->isAdbValid()) + return false; + + QProcess adbApp; + adbApp.start(plugin->getCurrentAdb(), QStringList({"start-server"})); + if (!waitForProc(adbApp, false)) + return false; + + return true; +} + +bool AdbManager::exec(const QStringList& arguments, QString* stdOut, QString* stdErr) +{ + QByteArray* out = stdOut ? new QByteArray() : nullptr; + QByteArray* err = stdErr ? new QByteArray() : nullptr; + bool res = execBytes(arguments, out, err); + + if (stdOut) + { + *stdOut = decode(*out); + delete out; + } + + if (stdErr) + { + *stdErr = decode(*err); + delete err; + } + + return res; +} + +QByteArray AdbManager::encode(const QString& input) +{ + return input.toUtf8(); +} + +QString AdbManager::decode(const QByteArray& input) +{ + return QString::fromUtf8(input); +} + +bool AdbManager::execLongCommand(const QStringList& arguments, QProcess& proc, QByteArray* stdErr) +{ + // Take off initial arguments from ADB, store it to use with "push". + QStringList primaryArguments; + QStringList args = arguments; + while (args.first() != "shell") + primaryArguments << args.takeFirst(); + + args.removeFirst(); // remove the shell itself + + // Escape remaining arguments for the script + QString cmd = " '" + args.replaceInStrings("'", "'\''").join("' '") + "'"; + + // Now, the temporary file for the script + QTemporaryFile tmpFile("SQLiteStudio-XXXXXX.sh"); + if (!tmpFile.open()) + { + if (stdErr) + *stdErr = encode(QString("Could not create temporary file: %1").arg(tmpFile.fileName())); + + return false; + } + + tmpFile.write(cmd.toUtf8()); + tmpFile.close(); + + // Push the file + args = primaryArguments; + args << "push" << tmpFile.fileName() << "/data/local/tmp"; + proc.start(plugin->getCurrentAdb(), args); + if (!waitForProc(proc, false)) + return false; + + QString remoteFile = ("/data/local/tmp/" + QFileInfo(tmpFile.fileName()).fileName()); + + // Execute the file + args = primaryArguments; + args << "shell" << "sh" << remoteFile; + proc.start(plugin->getCurrentAdb(), args); + if (!waitForProc(proc, false)) + return false; + + // Delete the file from device + args = primaryArguments; + args << "shell" << "rm" << remoteFile; + QProcess localProc; + localProc.start(plugin->getCurrentAdb(), args); + if (!waitForProc(localProc, false)) + { + // Not a critical issue... + qWarning() << "Could not clean up execution script from the device: " << remoteFile << "\nDetails:\n" + << localProc.readAllStandardOutput() << "\n" << localProc.readAllStandardError(); + } + + return true; +} + +QStringList AdbManager::getDevicesInternal(bool emitSignal) +{ + QStringList devices; + QString stdOut; + if (!exec(QStringList({"devices"}), &stdOut)) + { + if (emitSignal) + emit internalDeviceListUpdate(devices); + + return devices; + } + + QRegularExpression re("(.*)\\s+device$"); + QRegularExpressionMatch match; + QStringList lines = stdOut.split("\n"); + for (const QString& line : lines) + { + match = re.match(line.trimmed()); + if (!match.hasMatch()) + continue; + + devices << match.captured(1).trimmed(); + } + + if (emitSignal) + emit internalDeviceListUpdate(devices); + + return devices; +} + +void AdbManager::syncDeviceListUpdate() +{ + currentDeviceList = getDevicesInternal(false); + updateDetails(currentDeviceList); +} + +void AdbManager::updateDetails(const QStringList& devices) +{ + QString stdOut; + QList detailList; + for (const QString& deviceId : devices) + { + Device deviceDetails; + deviceDetails.id = deviceId; + if (exec(QStringList({"-s", deviceId, "shell", "getprop", "ro.product.manufacturer"}), &stdOut)) + deviceDetails.fullName = stdOut.trimmed(); + else + qWarning() << "Could not read brand for device" << deviceId; + + if (exec(QStringList({"-s", deviceId, "shell", "getprop", "ro.product.model"}), &stdOut)) + deviceDetails.fullName += " " + stdOut.trimmed(); + else + qWarning() << "Could not read brand for device" << deviceId; + + deviceDetails.fullName = deviceDetails.fullName.trimmed(); + detailList << deviceDetails; + } + + emit deviceDetailsChanged(detailList); +} + +void AdbManager::updateDeviceList() +{ + if (!plugin->isAdbValid()) + return; + + updateDevicesFuture = QtConcurrent::run(this, &AdbManager::getDevicesInternal, true); +} + +void AdbManager::handleNewDeviceList(const QStringList& devices) +{ + if (currentDeviceList == devices) + return; + + currentDeviceList = devices; + QtConcurrent::run(this, &AdbManager::updateDetails, devices); + + emit deviceListChanged(devices); +} + +void AdbManager::handleNewDetails(const QList& devices) +{ + currentDeviceDetails.clear(); + for (Device device : devices) + currentDeviceDetails[device.id] = device; +} diff --git a/Plugins/DbAndroid/adbmanager.h b/Plugins/DbAndroid/adbmanager.h new file mode 100644 index 0000000..adeca90 --- /dev/null +++ b/Plugins/DbAndroid/adbmanager.h @@ -0,0 +1,65 @@ +#ifndef ADBMANAGER_H +#define ADBMANAGER_H + +#include +#include +#include + +class DbAndroid; +class QTimer; + +class AdbManager : public QObject +{ + Q_OBJECT + public: + struct Device + { + QString id; + QString fullName; + }; + + AdbManager(DbAndroid* plugin); + ~AdbManager(); + + const QStringList& getDevices(bool forceSyncUpdate = false); + Device getDetails(const QString& deviceId); + QList getDeviceDetails(); + QHash> getForwards(); + int makeForwardFor(const QString& device, int targetPort); + QString findAdb(); + bool testCurrentAdb(); + bool testAdb(const QString& adbPath, bool quiet = false); + bool execBytes(const QStringList& arguments, QByteArray* stdOut = nullptr, QByteArray* stdErr = nullptr); + bool exec(const QStringList& arguments, QString* stdOut = nullptr, QString* stdErr = nullptr); + + static QByteArray encode(const QString& input); + static QString decode(const QByteArray& input); + + private: + bool execLongCommand(const QStringList& arguments, QProcess& proc, QByteArray* stdErr); + bool waitForProc(QProcess& proc, bool quiet = false); + bool ensureAdbRunning(); + QStringList getDevicesInternal(bool emitSignal); + void syncDeviceListUpdate(); + void updateDetails(const QStringList& devices); + + DbAndroid* plugin; + QTimer* adbRunMonitor = nullptr; + QStringList currentDeviceList; + QHash currentDeviceDetails; + QFuture updateDevicesFuture; + + private slots: + void updateDeviceList(); + void handleNewDeviceList(const QStringList& devices); + void handleNewDetails(const QList& devices); + + signals: + void internalDeviceListUpdate(const QStringList& devices); + void deviceListChanged(const QStringList& devices); + void deviceDetailsChanged(const QList& details); +}; + +Q_DECLARE_METATYPE(QList) + +#endif // ADBMANAGER_H diff --git a/Plugins/DbAndroid/dbandroid.cpp b/Plugins/DbAndroid/dbandroid.cpp new file mode 100644 index 0000000..99150cd --- /dev/null +++ b/Plugins/DbAndroid/dbandroid.cpp @@ -0,0 +1,209 @@ +#include "adbmanager.h" +#include "dbandroid.h" +#include "dbandroidinstance.h" +#include "dbandroidpathdialog.h" +#include "mainwindow.h" +#include "services/notifymanager.h" +#include "uiconfig.h" +#include "statusfield.h" +#include "services/dbmanager.h" +#include "dbandroidconnectionfactory.h" +#include +#include +#include +#include +#include + +DbAndroid::DbAndroid() +{ +} + +QString DbAndroid::getLabel() const +{ + return "Android SQLite"; +} + +bool DbAndroid::checkIfDbServedByPlugin(Db* db) const +{ + return (db && dynamic_cast(db)); +} + +Db* DbAndroid::getInstance(const QString& name, const QString& path, const QHash& options, QString* errorMessage) +{ + DbAndroidUrl url(path); + if (!url.isValid()) + { + if (errorMessage) + *errorMessage = tr("Invalid or incomplete Android Database URL."); + + return nullptr; + } + + DbAndroidInstance* db = new DbAndroidInstance(this, name, path, options); + return db; +} + +QList DbAndroid::getOptionsList() const +{ + QList options; + + DbPluginOption customBrowseOpt; + customBrowseOpt.type = DbPluginOption::Type::CUSTOM_PATH_BROWSE; + customBrowseOpt.label = tr("Android database URL"); + customBrowseOpt.toolTip = tr("Select Android database"); + customBrowseOpt.customBrowseHandler = [this](const QString& initialPath) -> QString + { + DbAndroidPathDialog dialog(this, MAINWINDOW); + dialog.setUrl(initialPath); + if (!dialog.exec()) + return QString(); + + return dialog.getUrl().toUrlString(); + }; + options << customBrowseOpt; + + return options; +} + +QString DbAndroid::generateDbName(const QVariant& baseValue) +{ + // android://drgh:port/dbName + QUrl url(baseValue.toString()); + if (!url.isValid()) + return baseValue.toString(); + + return url.fileName(); +} + +bool DbAndroid::init() +{ + Q_INIT_RESOURCE(dbandroid); + + qRegisterMetaType>("QList"); + + connect(this, SIGNAL(adbReady(bool)), this, SLOT(handleValidAdb(bool))); + connect(this, SIGNAL(invalidAdb()), this, SLOT(handleInvalidAdb())); + connect(MAINWINDOW->getStatusField(), SIGNAL(linkActivated(QString)), this, SLOT(statusFieldLinkClicked(QString))); + + connectionFactory = new DbAndroidConnectionFactory(this); + + adbManager = new AdbManager(this); + connect(adbManager, SIGNAL(deviceListChanged(QStringList)), this, SLOT(deviceListChanged())); + + if (adbManager->testCurrentAdb()) + { + qDebug() << "Using ADB binary:" << cfg.DbAndroid.AdbPath.get(); + adbValid = true; + adbManager->getDevices(true); + } + else + { + QtConcurrent::run(this, &DbAndroid::initAdb); + } + return true; +} + +void DbAndroid::deinit() +{ + safe_delete(connectionFactory); + safe_delete(adbManager); + Q_CLEANUP_RESOURCE(dbandroid); +} + +QString DbAndroid::getCurrentAdb() +{ + return cfg.DbAndroid.AdbPath.get(); +} + +void DbAndroid::initAdb() +{ + QString adbPath = adbManager->findAdb(); + if (!adbPath.isEmpty()) + { + cfg.DbAndroid.AdbPath.set(adbPath); + qDebug() << "Found ADB binary:" << cfg.DbAndroid.AdbPath.get(); + emit adbReady(true); + return; + } + + emit invalidAdb(); +} + +QString DbAndroid::askForAdbPath() +{ +#if defined(Q_OS_UNIX) + QString adbAppName = "adb"; +#elif defined(Q_OS_WIN32) + QString adbAppName = "adb.exe"; +#else + qCritical() << "Unsupported OS for DbAndroid."; + return QString(); +#endif + QString file = QFileDialog::getOpenFileName(MAINWINDOW, tr("Select ADB"), getFileDialogInitPath(), QString("Android Debug Bridge (%1)").arg(adbAppName)); + if (file.isEmpty()) + return file; + + setFileDialogInitPathByFile(file); + return file; +} + +bool DbAndroid::isAdbValid() const +{ + return adbValid; +} + +DbAndroidConnectionFactory*DbAndroid::getConnectionFactory() const +{ + return connectionFactory; +} + +void DbAndroid::handleValidAdb(bool showMessage) +{ + adbValid = true; + if (showMessage) + notifyInfo(tr("Using Android Debug Bridge: %1").arg(cfg.DbAndroid.AdbPath.get())); + + DBLIST->rescanInvalidDatabasesForPlugin(this); +} + +void DbAndroid::handleInvalidAdb() +{ + notifyError(tr("Could not find Android Debug Bridge application. Click here to point out the location of the ADB application, " + "otherwise the %2 plugin will not support USB cable connections, only the network connection..").arg(SELECT_ADB_URL, getLabel())); +} + +void DbAndroid::statusFieldLinkClicked(const QString& link) +{ + if (link == SELECT_ADB_URL) + { + QString file = askForAdbPath(); + while (!file.isEmpty()) + { + if (adbManager->testAdb(file)) + { + cfg.DbAndroid.AdbPath.set(file); + emit adbReady(true); + return; + } + + int res = QMessageBox::warning(MAINWINDOW, tr("Invalid ADB"), tr("The selected ADB is incorrect.\n" + "Would you like to select another one, or leave it unconfigured?"), + tr("Select another ADB"), tr("Leave unconfigured")); + + if (res == 1) + return; + + file = askForAdbPath(); + } + } +} + +void DbAndroid::deviceListChanged() +{ + DBLIST->rescanInvalidDatabasesForPlugin(this); +} + +AdbManager* DbAndroid::getAdbManager() const +{ + return adbManager; +} diff --git a/Plugins/DbAndroid/dbandroid.h b/Plugins/DbAndroid/dbandroid.h new file mode 100644 index 0000000..68893d0 --- /dev/null +++ b/Plugins/DbAndroid/dbandroid.h @@ -0,0 +1,63 @@ +#ifndef DBANDROID_H +#define DBANDROID_H + +#include "dbandroid_global.h" +#include "plugins/dbplugin.h" +#include "plugins/genericplugin.h" +#include "config_builder.h" + +class AdbManager; +class DbAndroidConnectionFactory; + +CFG_CATEGORIES(DbAndroidConfig, + CFG_CATEGORY(DbAndroid, + CFG_ENTRY(QString, AdbPath, QString()) + ) +) + +class DBANDROIDSHARED_EXPORT DbAndroid : public GenericPlugin, public DbPlugin +{ + Q_OBJECT + SQLITESTUDIO_PLUGIN("dbandroid.json") + + public: + DbAndroid(); + + QString getLabel() const; + bool checkIfDbServedByPlugin(Db* db) const; + Db* getInstance(const QString& name, const QString& path, const QHash& options, QString* errorMessage); + QList getOptionsList() const; + QString generateDbName(const QVariant& baseValue); + bool init(); + void deinit(); + QString getCurrentAdb(); + AdbManager* getAdbManager() const; + bool isAdbValid() const; + DbAndroidConnectionFactory* getConnectionFactory() const; + + static_char* PASSWORD_OPT = "remote_access_password"; + + private: + void initAdb(); + QString askForAdbPath(); + + AdbManager* adbManager = nullptr; + DbAndroidConnectionFactory* connectionFactory = nullptr; + bool adbValid = false; + + static_char* SELECT_ADB_URL = "select_adb://"; + + CFG_LOCAL_PERSISTABLE(DbAndroidConfig, cfg) + + private slots: + void handleValidAdb(bool showMessage); + void handleInvalidAdb(); + void statusFieldLinkClicked(const QString& link); + void deviceListChanged(); + + signals: + void adbReady(bool showMessage); + void invalidAdb(); +}; + +#endif // DBANDROID_H diff --git a/Plugins/DbAndroid/dbandroid.json b/Plugins/DbAndroid/dbandroid.json new file mode 100644 index 0000000..0808bb4 --- /dev/null +++ b/Plugins/DbAndroid/dbandroid.json @@ -0,0 +1,9 @@ +{ + "type": "DbPlugin", + "title": "Android SQLite", + "description": "Provides support for remote SQLite databases on Android devices.", + "version": 10100, + "author": "SalSoft", + "minAppVersion": 30006, + "gui": true +} diff --git a/Plugins/DbAndroid/dbandroid.qrc b/Plugins/DbAndroid/dbandroid.qrc new file mode 100644 index 0000000..7646d2b --- /dev/null +++ b/Plugins/DbAndroid/dbandroid.qrc @@ -0,0 +1 @@ + diff --git a/Plugins/DbAndroid/dbandroid_global.h b/Plugins/DbAndroid/dbandroid_global.h new file mode 100644 index 0000000..aa128c1 --- /dev/null +++ b/Plugins/DbAndroid/dbandroid_global.h @@ -0,0 +1,12 @@ +#ifndef DBANDROID_GLOBAL_H +#define DBANDROID_GLOBAL_H + +#include + +#if defined(DBANDROID_LIBRARY) +# define DBANDROIDSHARED_EXPORT Q_DECL_EXPORT +#else +# define DBANDROIDSHARED_EXPORT Q_DECL_IMPORT +#endif + +#endif // DBANDROID_GLOBAL_H diff --git a/Plugins/DbAndroid/dbandroidconnection.cpp b/Plugins/DbAndroid/dbandroidconnection.cpp new file mode 100644 index 0000000..1d5ba05 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidconnection.cpp @@ -0,0 +1,14 @@ +#include "dbandroidconnection.h" +#include + +QByteArray DbAndroidConnection::convertBlob(const QString& value) +{ + if (!value.startsWith("X'", Qt::CaseInsensitive) || !value.endsWith("'")) + { + qCritical() << "Invalid BLOB value from Android. Doesn't match BLOB pattern:" << value; + return QByteArray(); + } + + return QByteArray::fromHex(value.mid(2, value.length() - 3).toLatin1()); +} + diff --git a/Plugins/DbAndroid/dbandroidconnection.h b/Plugins/DbAndroid/dbandroidconnection.h new file mode 100644 index 0000000..11e9be0 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidconnection.h @@ -0,0 +1,44 @@ +#ifndef DBANDROIDCONNECTION_H +#define DBANDROIDCONNECTION_H + +#include "dbandroidurl.h" +#include +#include +#include + +class DbAndroidConnection : public QObject +{ + Q_OBJECT + + public: + struct ExecutionResult + { + bool wasError = false; + int errorCode = 0; + QString errorMsg; + QStringList resultColumns; + QList resultDataMap; + QList resultDataList; + }; + + DbAndroidConnection(QObject* parent = 0) : QObject(parent) {} + virtual ~DbAndroidConnection() {} + + virtual bool connectToAndroid(const DbAndroidUrl& url) = 0; + virtual void disconnectFromAndroid() = 0; + virtual bool isConnected() const = 0; + virtual QString getDbName() const = 0; + virtual QStringList getDbList() = 0; + virtual QStringList getAppList() = 0; + virtual bool isAppOkay() const = 0; + virtual bool deleteDatabase(const QString& dbName) = 0; + virtual ExecutionResult executeQuery(const QString& query) = 0; + + protected: + static QByteArray convertBlob(const QString& value); + + signals: + void disconnected(); +}; + +#endif // DBANDROIDCONNECTION_H diff --git a/Plugins/DbAndroid/dbandroidconnectionfactory.cpp b/Plugins/DbAndroid/dbandroidconnectionfactory.cpp new file mode 100644 index 0000000..22377b4 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidconnectionfactory.cpp @@ -0,0 +1,28 @@ +#include "dbandroidconnectionfactory.h" +#include "dbandroidjsonconnection.h" +#include "dbandroidshellconnection.h" + +DbAndroidConnectionFactory::DbAndroidConnectionFactory(DbAndroid* plugin) : + plugin(plugin) +{ +} + +DbAndroidConnection* DbAndroidConnectionFactory::create(const QString& url, QObject* parent) +{ + return create(DbAndroidUrl(url), parent); +} + +DbAndroidConnection* DbAndroidConnectionFactory::create(const DbAndroidUrl& url, QObject* parent) +{ + switch (url.getMode()) + { + case DbAndroidMode::SHELL: + return new DbAndroidShellConnection(plugin, parent); + case DbAndroidMode::NETWORK: + case DbAndroidMode::USB: + return new DbAndroidJsonConnection(plugin, parent); + case DbAndroidMode::null: + break; + } + return nullptr; +} diff --git a/Plugins/DbAndroid/dbandroidconnectionfactory.h b/Plugins/DbAndroid/dbandroidconnectionfactory.h new file mode 100644 index 0000000..0e46c9f --- /dev/null +++ b/Plugins/DbAndroid/dbandroidconnectionfactory.h @@ -0,0 +1,21 @@ +#ifndef DBANDROIDCONNECTIONFACTORY_H +#define DBANDROIDCONNECTIONFACTORY_H + +#include "dbandroidurl.h" + +class DbAndroidConnection; +class DbAndroid; + +class DbAndroidConnectionFactory +{ + public: + explicit DbAndroidConnectionFactory(DbAndroid* plugin); + + DbAndroidConnection* create(const QString& url, QObject* parent = nullptr); + DbAndroidConnection* create(const DbAndroidUrl& url, QObject* parent = nullptr); + + private: + DbAndroid* plugin = nullptr; +}; + +#endif // DBANDROIDCONNECTIONFACTORY_H diff --git a/Plugins/DbAndroid/dbandroidinstance.cpp b/Plugins/DbAndroid/dbandroidinstance.cpp new file mode 100644 index 0000000..b60203e --- /dev/null +++ b/Plugins/DbAndroid/dbandroidinstance.cpp @@ -0,0 +1,143 @@ +#include "dbandroidconnection.h" +#include "dbandroidinstance.h" +#include "sqlqueryandroid.h" +#include "db/sqlerrorcodes.h" +#include "common/unused.h" +#include "dbandroid.h" +#include "dbandroidjsonconnection.h" +#include "dbandroidconnectionfactory.h" +#include "dbandroidurl.h" +#include "schemaresolver.h" +#include "services/notifymanager.h" +#include +#include +#include +#include + +DbAndroidInstance::DbAndroidInstance(DbAndroid* plugin, const QString& name, const QString& path, const QHash& connOptions) : + AbstractDb(name, path, connOptions), plugin(plugin) +{ + this->connOptions[SchemaResolver::USE_SCHEMA_CACHING] = true; +} + +DbAndroidInstance::~DbAndroidInstance() +{ + closeInternal(); +} + +SqlQueryPtr DbAndroidInstance::prepare(const QString& query) +{ + return SqlQueryPtr(new SqlQueryAndroid(this, connection, query)); +} + +QString DbAndroidInstance::getTypeLabel() +{ + return plugin->getLabel(); +} + +bool DbAndroidInstance::deregisterFunction(const QString& name, int argCount) +{ + // Unsupported by native Android driver + UNUSED(name); + UNUSED(argCount); + return true; +} + +bool DbAndroidInstance::registerScalarFunction(const QString& name, int argCount) +{ + // Unsupported by native Android driver + UNUSED(name); + UNUSED(argCount); + return true; +} + +bool DbAndroidInstance::registerAggregateFunction(const QString& name, int argCount) +{ + // Unsupported by native Android driver + UNUSED(name); + UNUSED(argCount); + return true; +} + +bool DbAndroidInstance::initAfterCreated() +{ + version = 3; + return AbstractDb::initAfterCreated(); +} + +bool DbAndroidInstance::isOpenInternal() +{ + return (connection && connection->isConnected()); +} + +void DbAndroidInstance::interruptExecution() +{ + // Unsupported by native Android driver +} + +QString DbAndroidInstance::getErrorTextInternal() +{ + return errorText; +} + +int DbAndroidInstance::getErrorCodeInternal() +{ + return errorCode; +} + +bool DbAndroidInstance::openInternal() +{ + connection = createConnection(); + bool res = connection->connectToAndroid(DbAndroidUrl(path)); + if (!res) + { + safe_delete(connection); + } + else + { + connect(connection, SIGNAL(disconnected()), this, SLOT(handleDisconnected())); + } + + return res; +} + +bool DbAndroidInstance::closeInternal() +{ + if (!connection) + return false; + + disconnect(connection, SIGNAL(disconnected()), this, SLOT(handleDisconnected())); + connection->disconnectFromAndroid(); + safe_delete(connection); + return true; +} + +bool DbAndroidInstance::registerCollationInternal(const QString& name) +{ + // Unsupported by native Android driver + UNUSED(name); + return true; +} + +bool DbAndroidInstance::deregisterCollationInternal(const QString& name) +{ + // Unsupported by native Android driver + UNUSED(name); + return true; +} + +DbAndroidConnection* DbAndroidInstance::createConnection() +{ + DbAndroidUrl url(path); + if (!url.isValid(false)) + return nullptr; + + return plugin->getConnectionFactory()->create(url, this); +} + +void DbAndroidInstance::handleDisconnected() +{ + safe_delete(connection); + notifyWarn(tr("Connection with Android database '%1' lost.").arg(getName())); + emit disconnected(); +} diff --git a/Plugins/DbAndroid/dbandroidinstance.h b/Plugins/DbAndroid/dbandroidinstance.h new file mode 100644 index 0000000..453b370 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidinstance.h @@ -0,0 +1,51 @@ +#ifndef DBANDROIDINSTANCE_H +#define DBANDROIDINSTANCE_H + +#include "db/abstractdb.h" +#include +#include +#include + +class DbAndroidConnection; +class DbAndroid; + +class DbAndroidInstance : public AbstractDb +{ + Q_OBJECT + + public: + typedef std::function AsyncDbListResponseHandler; + + DbAndroidInstance(DbAndroid* plugin, const QString& name, const QString& path, const QHash& connOptions); + ~DbAndroidInstance(); + + SqlQueryPtr prepare(const QString& query); + QString getTypeLabel(); + bool deregisterFunction(const QString& name, int argCount); + bool registerScalarFunction(const QString& name, int argCount); + bool registerAggregateFunction(const QString& name, int argCount); + bool initAfterCreated(); + + protected: + bool isOpenInternal(); + void interruptExecution(); + QString getErrorTextInternal(); + int getErrorCodeInternal(); + bool openInternal(); + bool closeInternal(); + bool registerCollationInternal(const QString& name); + bool deregisterCollationInternal(const QString& name); + + private: + DbAndroidConnection* createConnection(); + + DbAndroid* plugin = nullptr; + DbAndroidConnection* connection = nullptr; + int errorCode = 0; + QString errorText; + + private slots: + void handleDisconnected(); +}; + +#endif // DBANDROIDINSTANCE_H diff --git a/Plugins/DbAndroid/dbandroidjsonconnection.cpp b/Plugins/DbAndroid/dbandroidjsonconnection.cpp new file mode 100644 index 0000000..05d6469 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidjsonconnection.cpp @@ -0,0 +1,430 @@ +#include "dbandroidjsonconnection.h" +#include "dbandroid.h" +#include "adbmanager.h" +#include "services/notifymanager.h" +#include "common/blockingsocket.h" +#include "db/sqlerrorcodes.h" +#include +#include +#include + +DbAndroidJsonConnection::DbAndroidJsonConnection(DbAndroid* plugin, QObject *parent) : + DbAndroidConnection(parent), plugin(plugin) +{ + socket = new BlockingSocket(this); + adbManager = plugin->getAdbManager(); + connect(socket, SIGNAL(disconnected()), this, SLOT(handlePossibleDisconnection())); +} + +DbAndroidJsonConnection::~DbAndroidJsonConnection() +{ + cleanUp(); +} + +bool DbAndroidJsonConnection::connectToAndroid(const DbAndroidUrl& url) +{ + if (isConnected()) + { + qWarning() << "Already connected while calling DbAndroidConnection::connect()."; + return false; + } + + dbUrl = url; + mode = url.getMode(); + + switch (mode) + { + case DbAndroidMode::NETWORK: + return connectToNetwork(); + case DbAndroidMode::USB: + return connectToDevice(); + case DbAndroidMode::SHELL: + qCritical() << "SHELL mode encountered in DbAndroidJsonConnection"; + break; + case DbAndroidMode::null: + qCritical() << "Null mode encountered in DbAndroidJsonConnection"; + break; + } + + qCritical() << "Invalid Android db mode while connecting:" << static_cast(mode); + return false; +} + +void DbAndroidJsonConnection::disconnectFromAndroid() +{ + socket->disconnectFromHost(); + connectedState = false; +} + +bool DbAndroidJsonConnection::isConnected() const +{ + if (!socket) + return false; + + return connectedState; +} + +QByteArray DbAndroidJsonConnection::send(const QByteArray& data) +{ + QByteArray bytes = sizeToBytes(data.size()); + bytes.append(data); + return sendBytes(bytes); +} + +QString DbAndroidJsonConnection::getDbName() const +{ + return dbUrl.getDbName(); +} + +QByteArray DbAndroidJsonConnection::sendBytes(const QByteArray& data) +{ + //qDebug() << "Sending" << data; + bool success = socket->send(data); + if (!success) + { + qCritical() << "Error writing bytes to Android socket:" << socket->getErrorText(); + return QByteArray(); + } + + QByteArray sizeBytes = socket->read(4, 5000, &success); + if (!success) + { + qCritical() << "Error reading response size from Android socket:" << socket->getErrorText(); + return QByteArray(); + } + + qint32 size = bytesToSize(sizeBytes); + QByteArray responseBytes = socket->read(size, 5000, &success); + if (!success) + { + qCritical() << "Error reading response from Android socket:" << socket->getErrorText(); + return QByteArray(); + } + //qDebug() << "Received" << responseBytes; + return responseBytes; +} + +void DbAndroidJsonConnection::handleSocketError() +{ + qWarning() << "Blocking socket error in Android connection:" << socket->getErrorText(); + handlePossibleDisconnection(); +} + +void DbAndroidJsonConnection::handlePossibleDisconnection() +{ + if (connectedState && !socket->isConnected()) + { + connectedState = false; + emit disconnected(); + } +} + +QByteArray DbAndroidJsonConnection::sizeToBytes(qint32 size) +{ + QByteArray bytes; + for (int i = 0; i < 4; i++) + bytes.append((size >> (8*i)) & 0xff); + + return bytes; +} + +qint32 DbAndroidJsonConnection::bytesToSize(const QByteArray& bytes) +{ + int size = (((unsigned char)bytes[3]) << 24) | + (((unsigned char)bytes[2]) << 16) | + (((unsigned char)bytes[1]) << 8) | + ((unsigned char)bytes[0]); + + return size; +} + +QVariant DbAndroidJsonConnection::convertJsonValue(const QJsonValue& value) +{ + if (value.isArray()) + { + // BLOB + QJsonArray blobContainer = value.toArray(); + if (blobContainer.size() < 1) + { + qCritical() << "Invalid blob value from Android - empty array."; + return QByteArray(); + } + + return convertBlob(blobContainer.first().toString()); + } + + // Regular value + return value.toVariant(); +} + +bool DbAndroidJsonConnection::connectToNetwork() +{ + if (!dbUrl.isHostValid()) + return false; + + return connectToTcp(dbUrl.getHost(), dbUrl.getPort()); +} + +bool DbAndroidJsonConnection::connectToDevice() +{ + if (!plugin->isAdbValid()) + return false; + + if (!plugin->getAdbManager()->getDevices().contains(dbUrl.getDevice())) + { + notifyWarn(tr("Cannot connect to device %1, because it's not visible to your computer.").arg(dbUrl.getDevice())); + return false; + } + + int localPort = plugin->getAdbManager()->makeForwardFor(dbUrl.getDevice(), dbUrl.getPort()); + if (localPort < 0) + { + notifyError(tr("Failed to create port forwarding for device %1 for port %2.") + .arg(dbUrl.getDevice(), QString::number(dbUrl.getPort()))); + return false; + } + + return connectToTcp("127.0.0.1", localPort); +} + +bool DbAndroidJsonConnection::connectToTcp(const QString& ip, int port) +{ + bool success = socket->connectToHost(ip, port); + if (!success) + { + qWarning() << "Could not connect to network host for Android DB:" << ip << ":" << port << ", details:" << socket->getErrorText(); + notifyWarn(tr("Could not connect to network host: %1:%2").arg(ip, QString::number(port))); + return false; + } + + connectedState = true; + + // Evaluate the connection and send the security token + static_qstring(pingCmd, "{ping:\"%1\"}"); + QDate date = QDateTime::currentDateTime().date(); + QString tokenString = "06fn43" + QString::number(date.dayOfYear()) + "3ig7ws" + QString::number(date.year()) + "53"; + QByteArray md5 = QCryptographicHash::hash(tokenString.toUtf8(), QCryptographicHash::Md5); + QByteArray token = md5.toBase64(); + + QByteArray response = send(pingCmd.arg(QString::fromLatin1(token)).toUtf8()); + if (response != PING_RESPONSE_OK) + { + qWarning() << "Connection to" << ip << ":" << port << "has failed, because response to PING was:" << response; + notifyWarn(tr("Cannot connect to SQLiteStudio service on Android device. The remote service is unavailable or invalid.")); + handleConnectionFailed(); + return false; + } + + // Authenticate + QString pass = dbUrl.getPassword(); + if (!pass.isEmpty()) + { + static_qstring(passPharse, "{auth:\"%1\"}"); + response = send(passPharse.arg(pass.replace("\"", "\\\"")).toUtf8()); + if (response != PASS_RESPONSE_OK) + { + notifyWarn(tr("Cannot connect to %1:%2, because password is invalid.").arg(ip, QString::number(port))); + handleConnectionFailed(); + return false; + } + } + + return true; +} + +void DbAndroidJsonConnection::handleConnectionFailed() +{ + connectedState = false; + socket->disconnectFromHost(); +} + +void DbAndroidJsonConnection::cleanUp() +{ + disconnectFromAndroid(); + safe_delete(socket); +} + +QStringList DbAndroidJsonConnection::getDbList() +{ + if (!isConnected()) + { + qWarning() << "Called DbAndroidJsonConnection::getDbList() on closed connection."; + return QStringList(); + } + + QByteArray result = send(LIST_CMD); + return handleDbListResult(result); +} + +QStringList DbAndroidJsonConnection::getAppList() +{ + return QStringList(); +} + +bool DbAndroidJsonConnection::isAppOkay() const +{ + return true; +} + +QStringList DbAndroidJsonConnection::handleDbListResult(const QByteArray& results) +{ + QJsonParseError jsonError; + QJsonDocument jsonResponse = QJsonDocument::fromJson(results, &jsonError); + if (jsonError.error != QJsonParseError::NoError) + { + qCritical() << "Error while parsing response from Android:" << jsonError.errorString(); + return QStringList(); + } + + QJsonObject responseObject = jsonResponse.object(); + if (responseObject.contains("generic_error")) + { + qCritical() << "Generic error from Android:" << responseObject["generic_error"].toInt(); + return QStringList(); + } + + if (!responseObject.contains("list")) + { + qCritical() << "Missing 'list' in response from Android."; + return QStringList(); + } + + QStringList dbNames; + for (const QVariant& name : responseObject["list"].toArray().toVariantList()) + dbNames << name.toString(); + + return dbNames; +} + +bool DbAndroidJsonConnection::deleteDatabase(const QString& dbName) +{ + if (!isConnected()) + { + qWarning() << "Called DbAndroidConnection::deleteDatabase() on closed database."; + return false; + } + + QByteArray result = send(QString(DELETE_DB_CMD).arg(dbName).toUtf8()); + return handleStdResult(result); +} + +DbAndroidConnection::ExecutionResult DbAndroidJsonConnection::executeQuery(const QString& query) +{ + DbAndroidConnection::ExecutionResult executionResults; + + QJsonDocument json = wrapQueryInJson(query); + QByteArray responseBytes = send(json.toJson(QJsonDocument::Compact)); + + QJsonParseError jsonError; + QJsonDocument jsonResponse = QJsonDocument::fromJson(responseBytes, &jsonError); + if (jsonError.error != QJsonParseError::NoError) + { + executionResults.wasError = true; + executionResults.errorMsg = tr("Error while parsing response from Android: %1").arg(jsonError.errorString()); + return executionResults; + } + + QJsonObject responseObject = jsonResponse.object(); + if (responseObject.contains("generic_error")) + { + executionResults.wasError = true; + executionResults.errorMsg = tr("Generic error from Android: %1").arg(responseObject["generic_error"].toInt()); + return executionResults; + } + + if (responseObject.contains("error_code")) + { + executionResults.errorCode = responseObject["error_code"].toInt(); + executionResults.errorMsg = responseObject["error_message"].toString(); + return executionResults; + } + + if (!responseObject.contains("columns")) + { + executionResults.wasError = true; + executionResults.errorMsg = tr("Missing 'columns' in response from Android."); + return executionResults; + } + + if (!responseObject.contains("data")) + { + executionResults.wasError = true; + executionResults.errorMsg = tr("Missing 'columns' in response from Android."); + return executionResults; + } + + for (const QVariant& col : responseObject["columns"].toArray().toVariantList()) + executionResults.resultColumns << col.toString(); + + QJsonArray jsonRows = responseObject["data"].toArray(); + QJsonObject jsonRow; + QJsonValue jsonValue; + QVariantHash rowAsMap; + QVariantList rowAsList; + QVariant cellValue; + for (int i = 0, total = jsonRows.size(); i < total; ++i) + { + jsonRow = jsonRows[i].toObject(); + for (const QString& colName : executionResults.resultColumns) + { + if (!jsonRow.contains(colName)) + { + executionResults.wasError = true; + executionResults.errorMsg = tr("Response from Android has missing data for column '%1' in row %2.").arg(colName, QString::number(i+1)); + return executionResults; + } + + jsonValue = jsonRow[colName]; + cellValue = convertJsonValue(jsonValue); + rowAsMap[colName] = cellValue; + rowAsList << cellValue; + } + + executionResults.resultDataMap << rowAsMap; + executionResults.resultDataList << rowAsList; + + rowAsMap.clear(); + rowAsList.clear(); + } + + return executionResults; +} + +QJsonDocument DbAndroidJsonConnection::wrapQueryInJson(const QString& query) +{ + QJsonDocument doc; + + QJsonObject rootObj; + rootObj["cmd"] = "QUERY"; + rootObj["db"] = dbUrl.getDbName(); + rootObj["query"] = query; + + doc.setObject(rootObj); + return doc; +} + +bool DbAndroidJsonConnection::handleStdResult(const QByteArray& results) +{ + QJsonParseError jsonError; + QJsonDocument jsonResponse = QJsonDocument::fromJson(results, &jsonError); + if (jsonError.error != QJsonParseError::NoError) + { + qCritical() << "Error while parsing response from Android:" << jsonError.errorString(); + return false; + } + + QJsonObject responseObject = jsonResponse.object(); + if (responseObject.contains("generic_error")) + { + qCritical() << "Generic error from Android:" << responseObject["generic_error"].toInt(); + return false; + } + + if (!responseObject.contains("result")) + { + qCritical() << "Missing 'result' in response from Android."; + return false; + } + + return (responseObject["result"].toString() == "ok"); +} diff --git a/Plugins/DbAndroid/dbandroidjsonconnection.h b/Plugins/DbAndroid/dbandroidjsonconnection.h new file mode 100644 index 0000000..ef0c943 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidjsonconnection.h @@ -0,0 +1,65 @@ +#ifndef DBANDROIDJSONCONNECTION_H +#define DBANDROIDJSONCONNECTION_H + +#include "dbandroidmode.h" +#include "common/global.h" +#include "common/expiringcache.h" +#include "dbandroidconnection.h" +#include + +class DbAndroid; +class AdbManager; +class BlockingSocket; + +class DbAndroidJsonConnection : public DbAndroidConnection +{ + Q_OBJECT + + public: + DbAndroidJsonConnection(DbAndroid* plugin, QObject *parent = 0); + ~DbAndroidJsonConnection(); + + bool connectToAndroid(const DbAndroidUrl& url); + void disconnectFromAndroid(); + bool isConnected() const; + QByteArray send(const QByteArray& data); + QString getDbName() const; + QStringList getDbList(); + QStringList getAppList(); + bool isAppOkay() const; + bool deleteDatabase(const QString& dbName); + ExecutionResult executeQuery(const QString& query); + + private: + QJsonDocument wrapQueryInJson(const QString& query); + bool connectToNetwork(); + bool connectToDevice(); + bool connectToTcp(const QString& ip, int port); + void cleanUp(); + QByteArray sendBytes(const QByteArray& data); + void handleSocketError(); + void handleConnectionFailed(); + QStringList handleDbListResult(const QByteArray& results); + bool handleStdResult(const QByteArray& results); + + static QByteArray sizeToBytes(qint32 size); + static qint32 bytesToSize(const QByteArray& bytes); + static QVariant convertJsonValue(const QJsonValue& value); + + DbAndroid* plugin = nullptr; + AdbManager* adbManager = nullptr; + BlockingSocket* socket = nullptr; + DbAndroidUrl dbUrl; + DbAndroidMode mode = DbAndroidMode::NETWORK; + bool connectedState = false; + + static_char* PASS_RESPONSE_OK = "{\"result\":\"ok\"}"; + static_char* PING_RESPONSE_OK = "{\"result\":\"pong\"}"; + static_char* LIST_CMD = "{cmd:\"LIST\"}"; + static_char* DELETE_DB_CMD = "{cmd:\"DELETE_DB\",db:\"%1\"}"; + + private slots: + void handlePossibleDisconnection(); +}; + +#endif // DBANDROIDJSONCONNECTION_H diff --git a/Plugins/DbAndroid/dbandroidmode.h b/Plugins/DbAndroid/dbandroidmode.h new file mode 100644 index 0000000..523fdd8 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidmode.h @@ -0,0 +1,13 @@ +#ifndef DBANDROIDMODE +#define DBANDROIDMODE + +enum class DbAndroidMode +{ + USB, + NETWORK, + SHELL, + null +}; + +#endif // DBANDROIDMODE + diff --git a/Plugins/DbAndroid/dbandroidpathdialog.cpp b/Plugins/DbAndroid/dbandroidpathdialog.cpp new file mode 100644 index 0000000..da1cf5c --- /dev/null +++ b/Plugins/DbAndroid/dbandroidpathdialog.cpp @@ -0,0 +1,579 @@ +#include "dbandroidpathdialog.h" +#include "ui_dbandroidpathdialog.h" +#include "common/ipvalidator.h" +#include "dbandroid.h" +#include "common/widgetcover.h" +#include "adbmanager.h" +#include "uiutils.h" +#include "iconmanager.h" +#include "dbandroidconnection.h" +#include "dbandroidconnectionfactory.h" +#include +#include +#include +#include +#include +#include +#include + +DbAndroidPathDialog::DbAndroidPathDialog(const DbAndroid* plugin, QWidget *parent) : + QDialog(parent), + plugin(plugin), + ui(new Ui::DbAndroidPathDialog) +{ + init(); +} + +DbAndroidPathDialog::~DbAndroidPathDialog() +{ + delete ui; +} + +void DbAndroidPathDialog::setUrl(const QString& url) +{ + dbUrl = DbAndroidUrl(url); + loadUrl(); +} + +void DbAndroidPathDialog::setUrl(const DbAndroidUrl& url) +{ + dbUrl = url; + loadUrl(); +} + +const DbAndroidUrl& DbAndroidPathDialog::getUrl() const +{ + return dbUrl; +} + +void DbAndroidPathDialog::init() +{ + ui->setupUi(this); + + dbListCover = new WidgetCover(ui->databaseCombo); + appListCover = new WidgetCover(ui->appCombo); + new UserInputFilter(ui->appFilterEdit, this, SLOT(applyAppFilter(QString))); + + ui->createDatabaseButton->setIcon(ICONS.PLUS); + ui->deleteDatabaseButton->setIcon(ICONS.DELETE); + + dbListUpdateTimer = new QTimer(this); + dbListUpdateTimer->setSingleShot(true); + dbListUpdateTimer->setInterval(500); + connect(dbListUpdateTimer, SIGNAL(timeout()), this, SLOT(refreshDbList())); + + appListUpdateTimer = new QTimer(this); + appListUpdateTimer->setSingleShot(true); + appListUpdateTimer->setInterval(500); + connect(appListUpdateTimer, SIGNAL(timeout()), this, SLOT(refreshAppList())); + + connect(ui->deviceCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(scheduleAppListUpdate())); + connect(ui->databaseCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateState())); + connect(ui->portSpin, SIGNAL(valueChanged(int)), this, SLOT(scheduleDbListUpdate())); + connect(ui->createDatabaseButton, SIGNAL(clicked()), this, SLOT(createNewDatabase())); + connect(ui->deleteDatabaseButton, SIGNAL(clicked()), this, SLOT(deleteSelectedDatabase())); + connect(ui->passwordGroup, SIGNAL(toggled(bool)), this, SLOT(updateState())); + connect(ui->passwordGroup, SIGNAL(toggled(bool)), this, SLOT(scheduleDbListUpdate())); + connect(ui->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(scheduleDbListUpdate())); + + connect(this, SIGNAL(asyncDbListUpdatingFinished(bool)), this, SLOT(handleFinishedAsyncDbListUpdate(bool))); + connect(this, SIGNAL(asyncAppListUpdatingFinished()), this, SLOT(handleFinishedAsyncAppListUpdate())); + connect(this, SIGNAL(callForDbListUpdate(QStringList)), this, SLOT(handleUpdateDbList(QStringList))); + connect(this, SIGNAL(callForAppListUpdate(QStringList)), this, SLOT(handleUpdateAppList(QStringList))); + connect(this, SIGNAL(callForValidations()), this, SLOT(updateValidations())); + connect(this, SIGNAL(callForDbCreationUpdate(bool)), this, SLOT(handleDbCreationUpdate(bool))); + + if (!plugin->isAdbValid()) + { + ui->ipRadio->setChecked(true); + ui->usbRadio->setEnabled(false); + ui->shellRadio->setEnabled(false); + } + else + { + refreshDevices(); + connect(plugin->getAdbManager(), SIGNAL(deviceDetailsChanged(QList)), this, SLOT(updateDeviceList())); + } + + connect(ui->ipRadio, SIGNAL(toggled(bool)), this, SLOT(modeChanged(bool))); + connect(ui->usbRadio, SIGNAL(toggled(bool)), this, SLOT(modeChanged(bool))); + connect(ui->shellRadio, SIGNAL(toggled(bool)), this, SLOT(modeChanged(bool))); + connect(ui->ipEdit, SIGNAL(textChanged(QString)), this, SLOT(scheduleDbListUpdate())); + setDbListUpdatesEnabled(true); + + handleDbCreationUpdate(false); + updateState(); + adjustSize(); +} + +void DbAndroidPathDialog::updateUrl() +{ + DbAndroidMode mode = getSelectedMode(); + dbUrl.setEnforcedMode(mode); + switch (mode) + { + case DbAndroidMode::NETWORK: + dbUrl.setHost(ui->ipEdit->text()); + dbUrl.setPort(ui->portSpin->value()); + break; + case DbAndroidMode::USB: + dbUrl.setDevice(ui->deviceCombo->currentData().toString()); + dbUrl.setPort(ui->portSpin->value()); + break; + case DbAndroidMode::SHELL: + dbUrl.setDevice(ui->deviceCombo->currentData().toString()); + dbUrl.setApplication(ui->appCombo->currentText()); + break; + case DbAndroidMode::null: + qCritical() << "Unknown mode in DbAndroidPathDialog::updateUrl()"; + return; + } + + dbUrl.setDbName(ui->databaseCombo->currentText()); + if (ui->passwordGroup->isChecked()) + dbUrl.setPassword(ui->passwordEdit->text()); + else + dbUrl.setPassword(QString()); +} + +void DbAndroidPathDialog::loadUrl() +{ + if (!dbUrl.isValid()) + return; + + switch (dbUrl.getMode()) + { + case DbAndroidMode::NETWORK: + ui->ipRadio->setChecked(true); + ui->ipEdit->setText(dbUrl.getHost()); + break; + case DbAndroidMode::SHELL: + ui->shellRadio->setChecked(true); + ui->deviceCombo->setCurrentIndex(ui->deviceCombo->findData(dbUrl.getDevice())); + setDbListUpdatesEnabled(false); + if (ui->appCombo->findText(dbUrl.getApplication()) == -1) + ui->appCombo->addItem(dbUrl.getApplication()); + + ui->appCombo->setCurrentText(dbUrl.getApplication()); + setDbListUpdatesEnabled(true); + break; + case DbAndroidMode::USB: + ui->usbRadio->setChecked(true); + ui->deviceCombo->setCurrentIndex(ui->deviceCombo->findData(dbUrl.getDevice())); + break; + case DbAndroidMode::null: + qCritical() << "Cannot load URL of mode 'null' in DbAndroidPathDialog::loadUrl()."; + return; + } + + ui->portSpin->setValue(dbUrl.getPort()); + if (ui->databaseCombo->findText(dbUrl.getDbName()) == -1) + ui->databaseCombo->addItem(dbUrl.getDbName()); + + ui->databaseCombo->setCurrentText(dbUrl.getDbName()); + + if (!dbUrl.getPassword().isNull()) + { + ui->passwordGroup->setChecked(true); + ui->passwordEdit->setText(dbUrl.getPassword()); + } +} + +void DbAndroidPathDialog::scheduleDbListUpdate() +{ + if (suspendDbListUpdates) + return; + + bool startCover = true; + if (dbListUpdateTimer->isActive()) + { + dbListUpdateTimer->stop(); + startCover = false; + } + + dbListUpdateTimer->start(); + if (startCover) + dbListCover->show(); + + handleDbCreationUpdate(false); + updateValidations(); +} + +void DbAndroidPathDialog::scheduleAppListUpdate() +{ + if (getSelectedMode() != DbAndroidMode::SHELL) + return; + + if (suspendAppListUpdates) + return; + + bool startCover = true; + if (appListUpdateTimer->isActive()) + { + appListUpdateTimer->stop(); + startCover = false; + } + + appListUpdateTimer->start(); + if (startCover) + appListCover->show(); + + updateValidations(); +} + +void DbAndroidPathDialog::refreshDbList() +{ + if (updatingDbList) + { + // Already busy, schedule next update afterwards. + scheduleDbListUpdate(); + return; + } + + updateUrl(); + ui->databaseCombo->clear(); + + if (!dbUrl.isValid(false)) + { + dbListCover->hide(); + return; + } + + updatingDbList = true; + QtConcurrent::run(this, &DbAndroidPathDialog::asyncDbUpdate, dbUrl.toUrlString(), dbUrl.getMode()); +} + +void DbAndroidPathDialog::refreshAppList() +{ + if (updatingAppList) + { + // Already busy, schedule next update afterwards. + scheduleAppListUpdate(); + return; + } + + updateUrl(); + setDbListUpdatesEnabled(false); + ui->appCombo->clear(); + setDbListUpdatesEnabled(true); + + if (!dbUrl.isValid(false)) + { + appListCover->hide(); + return; + } + + updatingAppList = true; + QtConcurrent::run(this, &DbAndroidPathDialog::asyncAppUpdate, dbUrl.toUrlString(), dbUrl.getMode()); +} + +void DbAndroidPathDialog::asyncDbUpdate(const QString& connectionUrl, DbAndroidMode enforcedMode) +{ + DbAndroidUrl url(connectionUrl); + url.setEnforcedMode(enforcedMode); + + QScopedPointer connection(plugin->getConnectionFactory()->create(url)); + if (!connection->connectToAndroid(url)) + { + qDebug() << "Could not open db connection" << connectionUrl; + emit asyncDbListUpdatingFinished(connection->isAppOkay()); + emit callForValidations(); + return; + } + + QStringList dbList = connection->getDbList(); + bool appOk = connection->isAppOkay(); + + connection->disconnectFromAndroid(); + + emit callForDbCreationUpdate(appOk); + emit callForDbListUpdate(dbList); + emit asyncDbListUpdatingFinished(appOk); + emit callForValidations(); +} + +void DbAndroidPathDialog::asyncAppUpdate(const QString& connectionUrl, DbAndroidMode enforcedMode) +{ + DbAndroidUrl url(connectionUrl); + url.setEnforcedMode(enforcedMode); + + QScopedPointer connection(plugin->getConnectionFactory()->create(url)); + QStringList appList = connection->getAppList(); + emit callForAppListUpdate(appList); + emit asyncAppListUpdatingFinished(); + emit callForValidations(); +} + +void DbAndroidPathDialog::refreshDevices() +{ + static_qstring(displayNameTpl, "%1 (%2)"); + ui->deviceCombo->clear(); + + QString displayName; + QList deviceDetails = plugin->getAdbManager()->getDeviceDetails(); + for (const AdbManager::Device& details : deviceDetails) + { + if (details.fullName.isEmpty()) + displayName = details.id; + else + displayName = displayNameTpl.arg(details.fullName, details.id); + + ui->deviceCombo->addItem(displayName, details.id); + } +} + +DbAndroidMode DbAndroidPathDialog::getSelectedMode() const +{ + if (ui->ipRadio->isChecked()) + return DbAndroidMode::NETWORK; + + if (ui->usbRadio->isChecked()) + return DbAndroidMode::USB; + + return DbAndroidMode::SHELL; +} + +void DbAndroidPathDialog::setDbListUpdatesEnabled(bool enabled) +{ + suspendDbListUpdates = !enabled; + if (enabled) + { + connect(ui->deviceCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(scheduleDbListUpdate())); + connect(ui->appCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(scheduleDbListUpdate())); + } + else + { + disconnect(ui->deviceCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(scheduleDbListUpdate())); + disconnect(ui->appCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(scheduleDbListUpdate())); + } +} + +void DbAndroidPathDialog::updateDeviceList() +{ + suspendDbListUpdates = true; + + bool dbListNeedsUpdate = false; + QString oldValue = ui->deviceCombo->currentData().toString(); + + refreshDevices(); + int idx = ui->deviceCombo->findData(oldValue); + if (idx > -1) + ui->deviceCombo->setCurrentIndex(idx); + else + dbListNeedsUpdate = true; + + suspendDbListUpdates = false; + + updateValidations(); + + if (dbListNeedsUpdate) + scheduleDbListUpdate(); +} + +void DbAndroidPathDialog::updateValidations() +{ + bool isUpdating = dbListUpdateTimer->isActive(); + bool ipOk = true; + bool deviceOk = true; + if (ui->ipRadio->isChecked()) + { + ipOk = IpValidator::check(ui->ipEdit->text()); + setValidState(ui->ipEdit, ipOk, tr("Enter valid IP address.")); + } + else + { + deviceOk = !ui->deviceCombo->currentData().toString().isEmpty(); + setValidState(ui->deviceCombo, deviceOk, tr("Pick Android device.")); + } + + bool dbOk = !ui->databaseCombo->currentText().isEmpty(); + setValidState(ui->databaseCombo, dbOk, tr("Pick Android database.")); + + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ipOk && deviceOk && dbOk && !isUpdating); +} + +void DbAndroidPathDialog::handleUpdateDbList(const QStringList& dbList) +{ + ui->databaseCombo->addItems(dbList); + if (dbList.contains(dbUrl.getDbName())) + ui->databaseCombo->setCurrentText(dbUrl.getDbName()); +} + +void DbAndroidPathDialog::handleUpdateAppList(const QStringList& apps) +{ + fullAppList = apps; + QStringList filtered = apps.filter(ui->appFilterEdit->text(), Qt::CaseInsensitive); + ui->appCombo->addItems(filtered); + if (filtered.contains(dbUrl.getApplication())) + ui->appCombo->setCurrentText(dbUrl.getApplication()); +} + +void DbAndroidPathDialog::handleFinishedAsyncDbListUpdate(bool appOkay) +{ + if (getSelectedMode() == DbAndroidMode::SHELL) + setValidState(ui->appCombo, appOkay, tr("Selected Android application is unknown, or not debuggable.")); + + dbListCover->hide(); + updatingDbList = false; +} + +void DbAndroidPathDialog::handleFinishedAsyncAppListUpdate() +{ + appListCover->hide(); + updatingAppList = false; +} + +void DbAndroidPathDialog::handleDbCreationUpdate(bool canCreateDatabases) +{ + ui->createDatabaseButton->setEnabled(canCreateDatabases); +} + +void DbAndroidPathDialog::createNewDatabase() +{ + DbAndroidUrl tmpUrl(dbUrl); + tmpUrl.setDbName(QString()); + + DbAndroidConnection::ExecutionResult results; + QString name; + bool ok = false; + while (!ok) + { + name = QInputDialog::getText(this, tr("Create new database"), tr("Please provide name for the new database.\n" + "It's the name which Android application will use to connect to the database:")); + + if (name.isNull()) + break; + + if (ui->databaseCombo->findText(name) > -1) + { + QMessageBox::warning(this, tr("Invalid name"), tr("Database with the same name (%1) already exists on the device.\n" + "The name must be unique.")); + continue; + } + + tmpUrl.setDbName(name); + QScopedPointer connection(plugin->getConnectionFactory()->create(tmpUrl)); + if (!connection->connectToAndroid(tmpUrl)) + { + QMessageBox::warning(this, tr("Invalid name"), tr("Could not create database '%1', because could not connect to the device.").arg(name)); + continue; + } + + results = connection->executeQuery("PRAGMA encoding;"); + ok = !results.wasError && results.resultDataList.size() > 0; + connection->disconnectFromAndroid(); + + if (!ok) + QMessageBox::warning(this, tr("Invalid name"), tr("Could not create database '%1'.\nDetails: %2").arg(name, results.errorMsg)); + } + + if (ok) + { + ui->databaseCombo->addItem(name); + ui->databaseCombo->setCurrentText(name); + } +} + +void DbAndroidPathDialog::deleteSelectedDatabase() +{ + updateUrl(); + QString dbName = dbUrl.getDbName(); + + QMessageBox::StandardButton res = QMessageBox::question(this, tr("Delete database"), tr("Are you sure you want to delete database '%1' from %2?") + .arg(dbName, dbUrl.getDisplayName())); + + if (res != QMessageBox::Yes) + return; + + int idx = ui->databaseCombo->findText(dbName); + if (idx < 0) + { + QStringList dbList; + for (int i = 0, total = ui->databaseCombo->count(); i < total; ++i) + dbList << ui->databaseCombo->itemText(i); + + qCritical() << "Tried to delete database, but it's not in the list of databases:" << dbName << "and the list is:" << dbList; + return; + } + + // Local db instance, will close on deletion. + QScopedPointer connection(plugin->getConnectionFactory()->create(dbUrl)); + if (!connection->connectToAndroid(dbUrl)) + { + QMessageBox::critical(this, tr("Error deleting"), tr("Could not connect to %1 in order to delete database '%2'.").arg(dbUrl.getDisplayName(), dbName)); + return; + } + + if (!connection->deleteDatabase(dbName)) + { + QMessageBox::critical(this, tr("Error deleting"), tr("Could not delete database named '%1' from the device.\n" + "Android device refused deletion, or it was impossible.").arg(dbName)); + + connection->disconnectFromAndroid(); + return; + } + connection->disconnectFromAndroid(); + + ui->databaseCombo->removeItem(idx); + if (ui->databaseCombo->count() > 0) + { + if (idx < ui->databaseCombo->count()) + ui->databaseCombo->setCurrentIndex(idx); + else + ui->databaseCombo->setCurrentIndex(ui->databaseCombo->count() - 1); + } +} + +void DbAndroidPathDialog::modeChanged(bool checked) +{ + if (!checked) + return; + + updateState(); + adjustSize(); + scheduleAppListUpdate(); + + if (getSelectedMode() != DbAndroidMode::SHELL) + scheduleDbListUpdate(); +} + +void DbAndroidPathDialog::applyAppFilter(const QString& value) +{ + QString selectedApp = ui->appCombo->currentText(); + QStringList filtered = fullAppList.filter(value, Qt::CaseInsensitive); + bool callDbListUpdate = false; + + setDbListUpdatesEnabled(false); + ui->appCombo->clear(); + ui->appCombo->addItems(filtered); + if (filtered.contains(selectedApp)) + ui->appCombo->setCurrentText(selectedApp); + else + callDbListUpdate = true; + + setDbListUpdatesEnabled(true); + + if (callDbListUpdate) + scheduleDbListUpdate(); +} + +void DbAndroidPathDialog::accept() +{ + updateUrl(); + QDialog::accept(); +} + +void DbAndroidPathDialog::updateState() +{ + DbAndroidMode mode = getSelectedMode(); + + ui->deviceGroup->setVisible(mode == DbAndroidMode::SHELL || mode == DbAndroidMode::USB); + ui->ipGroup->setVisible(mode == DbAndroidMode::NETWORK); + ui->portGroup->setVisible(mode == DbAndroidMode::NETWORK || mode == DbAndroidMode::USB); + ui->appGroup->setVisible(mode == DbAndroidMode::SHELL); + ui->passwordGroup->setVisible(mode == DbAndroidMode::NETWORK || mode == DbAndroidMode::USB); + + ui->deleteDatabaseButton->setEnabled(ui->databaseCombo->currentIndex() > -1); + ui->passwordEdit->setEnabled(ui->passwordGroup->isChecked()); + updateValidations(); +} diff --git a/Plugins/DbAndroid/dbandroidpathdialog.h b/Plugins/DbAndroid/dbandroidpathdialog.h new file mode 100644 index 0000000..4c4496f --- /dev/null +++ b/Plugins/DbAndroid/dbandroidpathdialog.h @@ -0,0 +1,80 @@ +#ifndef DBANDROIDPATHDIALOG_H +#define DBANDROIDPATHDIALOG_H + +#include "dbandroidurl.h" +#include + +namespace Ui { + class DbAndroidPathDialog; +} + +class DbAndroid; +class QTimer; +class WidgetCover; +class DbAndroidInstance; + +class DbAndroidPathDialog : public QDialog +{ + Q_OBJECT + + public: + DbAndroidPathDialog(const DbAndroid* plugin, QWidget *parent = 0); + ~DbAndroidPathDialog(); + void setUrl(const QString& url); + void setUrl(const DbAndroidUrl& url); + const DbAndroidUrl& getUrl() const; + + private: + void init(); + void updateUrl(); + void loadUrl(); + void asyncDbUpdate(const QString& connectionUrl, DbAndroidMode enforcedMode); + void asyncAppUpdate(const QString& connectionUrl, DbAndroidMode enforcedMode); + void refreshDevices(); + DbAndroidMode getSelectedMode() const; + void setDbListUpdatesEnabled(bool enabled); + + const DbAndroid* plugin = nullptr; + DbAndroidUrl dbUrl; + Ui::DbAndroidPathDialog *ui; + QTimer* dbListUpdateTimer = nullptr; + QTimer* appListUpdateTimer = nullptr; + WidgetCover* dbListCover = nullptr; + WidgetCover* appListCover = nullptr; + bool updatingDbList = false; + bool updatingAppList = false; + bool suspendDbListUpdates = false; + bool suspendAppListUpdates = false; + QStringList fullAppList; + + private slots: + void scheduleDbListUpdate(); + void scheduleAppListUpdate(); + void updateState(); + void refreshDbList(); + void refreshAppList(); + void updateDeviceList(); + void updateValidations(); + void handleUpdateDbList(const QStringList& dbList); + void handleUpdateAppList(const QStringList& apps); + void handleFinishedAsyncDbListUpdate(bool appOkay); + void handleFinishedAsyncAppListUpdate(); + void handleDbCreationUpdate(bool canCreateDatabases); + void createNewDatabase(); + void deleteSelectedDatabase(); + void modeChanged(bool checked); + void applyAppFilter(const QString& value); + + public slots: + void accept(); + + signals: + void callForValidations(); + void callForDbCreationUpdate(bool canCreateDatabases); + void asyncDbListUpdatingFinished(bool appOkay); + void asyncAppListUpdatingFinished(); + void callForDbListUpdate(const QStringList& newList); + void callForAppListUpdate(const QStringList& newList); +}; + +#endif // DBANDROIDPATHDIALOG_H diff --git a/Plugins/DbAndroid/dbandroidpathdialog.ui b/Plugins/DbAndroid/dbandroidpathdialog.ui new file mode 100644 index 0000000..3643a9c --- /dev/null +++ b/Plugins/DbAndroid/dbandroidpathdialog.ui @@ -0,0 +1,244 @@ + + + DbAndroidPathDialog + + + + 0 + 0 + 402 + 546 + + + + + 400 + 0 + + + + Android database URL + + + + + + Connection method + + + + + + USB cable - port forwarding + + + true + + + + + + + USB cable - sqlite3 command + + + + + + + Network (IP address) + + + + + + + + + + Device + + + + + + + + + + + + IP address + + + + + + 15 + + + ???.???.???.??? + + + true + + + + + + + + + + Port + + + + + + 1 + + + 65535 + + + 12121 + + + + + + + + + + Remote access password + + + true + + + false + + + + + + <p>This is password configured in the SQLiteStudio service being embeded in the Android application.</p> + + + QLineEdit::Password + + + + + + + + + + Application + + + + + + + + + + 100 + 16777215 + + + + Filter + + + true + + + + + + + + + + Database + + + + + + + + + Create a new database directly on the device. + + + + + + + + + + Delete currently selected database from the device. The currently selected database is the one picked in the list on the left of this button. + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + DbAndroidPathDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DbAndroidPathDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/Plugins/DbAndroid/dbandroidshellconnection.cpp b/Plugins/DbAndroid/dbandroidshellconnection.cpp new file mode 100644 index 0000000..1a76f8d --- /dev/null +++ b/Plugins/DbAndroid/dbandroidshellconnection.cpp @@ -0,0 +1,363 @@ +#include "dbandroidshellconnection.h" +#include "adbmanager.h" +#include "dbandroid.h" +#include "services/notifymanager.h" +#include "common/utils_sql.h" +#include "csvserializer.h" +#include + +const CsvFormat DbAndroidShellConnection::CSV_FORMAT = CsvFormat(",", "\r\n", true, true); + +DbAndroidShellConnection::DbAndroidShellConnection(DbAndroid* plugin, QObject* parent) : + DbAndroidConnection(parent), plugin(plugin) +{ + this->adbManager = plugin->getAdbManager(); + connect(adbManager, SIGNAL(deviceListChanged(QStringList)), this, SLOT(checkForDisconnection(QStringList))); +} + +DbAndroidShellConnection::~DbAndroidShellConnection() +{ + +} + +bool DbAndroidShellConnection::connectToAndroid(const DbAndroidUrl& url) +{ + if (url.getMode() != DbAndroidMode::SHELL) + return false; + + if (!adbManager->getDevices().contains(url.getDevice())) + { + notifyWarn(tr("Cannot connect to device %1, because it's not visible to your computer.").arg(url.getDevice())); + return false; + } + + // Check if application is correct + if (url.getApplication().isEmpty()) + { + qCritical() << "Tried to connect to an empty application in DbAndroidShellConnection::connectToAndroid()"; + return false; + } + + QString stdOut; + bool res = adbManager->exec(QStringList({"shell", "run-as", url.getApplication(), "echo", "1"}), &stdOut); + if (!res) + { + notifyWarn(tr("Cannot connect to device %1, because the application %2 doesn't seem to be installed on the device.").arg(url.getDevice(), url.getApplication())); + return false; + } + + QMutexLocker lock(&appOkMutex); + appOkay = true; + if (stdOut.startsWith("run-as:")) + { + appOkay = false; + qWarning() << "Cannot connect to device" << url.getDevice() << "/" << url.getApplication() << "\nDetails:\n" << stdOut.trimmed(); + notifyWarn(tr("Cannot connect to device %1, because the application %2 is not debuggable.") + .arg(url.getDevice(), url.getApplication())); + return false; + } + + // Check if sqlite3 is available + res = adbManager->exec(QStringList({"shell", "run-as", url.getApplication(), "sqlite3", "--version"})); + if (!res) + { + notifyWarn(tr("Cannot connect to device %1, because '%2' command doesn't seem to be available on the device.").arg(url.getDevice(), "sqlite3")); + return false; + } + + // Check if databases directory exists + res = adbManager->exec(QStringList({"shell", "run-as", url.getApplication(), "ls", "databases"})); + if (!res) + { + // Doesn't exist. Create if possible. + res = adbManager->exec(QStringList({"shell", "run-as", url.getApplication(), "mkdir", "databases"})); + if (!res) + { + notifyWarn(tr("Cannot connect to device %1, because '%2' database cannot be accessed on the device.").arg(url.getDevice(), "sqlite3")); + return false; + } + } + + // Try to connect to target database. + connectionUrl = url; + connected = true; + + ExecutionResult response = executeQuery("select sqlite_version()"); + if (response.wasError) + { + disconnectFromAndroid(); + notifyWarn(tr("Cannot connect to device %1, because '%2' database cannot be accessed on the device. Details: %3") + .arg(url.getDevice(), "sqlite3", response.errorMsg)); + return false; + } + + return true; +} + +void DbAndroidShellConnection::disconnectFromAndroid() +{ + connectionUrl = DbAndroidUrl(); + connected = false; +} + +bool DbAndroidShellConnection::isConnected() const +{ + return connected; +} + +QString DbAndroidShellConnection::getDbName() const +{ + return connectionUrl.getDbName(); +} + +QStringList DbAndroidShellConnection::getDbList() +{ + QMutexLocker lock(&appOkMutex); + appOkay = true; + QString out; + bool res = adbManager->exec(QStringList({"shell", "run-as", connectionUrl.getApplication(), "ls", "databases"}), &out); + if (!res) + return QStringList(); + + if (out.startsWith("run-as:")) // means error + { + appOkay = false; + notifyWarn(tr("Cannot get list of databases for application %1. Details: %2").arg(connectionUrl.getApplication(), out.trimmed())); + qWarning() << "DbAndroidShellConnection::getDbList():" << out; + return QStringList(); + } + + QStringList finalList; + for (const QString& dbName : out.trimmed().split("\n", QString::SkipEmptyParts)) + { + if (dbName.trimmed().endsWith("-journal")) + continue; + + finalList << dbName.trimmed(); + } + + return finalList; +} + +QStringList DbAndroidShellConnection::getAppList() +{ + QString out; + bool res = adbManager->exec(QStringList({"shell", "pm list packages -3"}), &out); + if (!res) + return QStringList(); + + QStringList appList; + for (const QString& line : out.trimmed().split("\n", QString::SkipEmptyParts)) + appList << line.mid(8).trimmed(); // skip "package:" prefix + + return appList; +} + +bool DbAndroidShellConnection::isAppOkay() const +{ + QMutexLocker lock(&appOkMutex); + return appOkay; +} + +bool DbAndroidShellConnection::deleteDatabase(const QString& dbName) +{ + return adbManager->exec(QStringList({"shell", "run-as", connectionUrl.getApplication(), "rm", "-f", "databases/" + dbName, "databases/" + dbName + "-journal"})); +} + +DbAndroidConnection::ExecutionResult DbAndroidShellConnection::executeQuery(const QString& query) +{ + const static QStringList stdArguments = QStringList({"shell", "run-as", "", "sqlite3", "-csv", "-separator", ",", "-batch", "-header"}); + + // Prepare usual arguments + QStringList args = stdArguments; + args.replace(2, connectionUrl.getApplication()); + args << "databases/" + connectionUrl.getDbName(); + args << AdbManager::encode(query); + + // In case of SELECT we want to union typeof() for all columns first, then original query + bool isSelect = false; + getQueryAccessMode(query, Dialect::Sqlite3, &isSelect); + QStringList columnNames; + bool firstHalfForTypes = false; + if (isSelect) + { + columnNames = findColumns(args, query); + if (columnNames.size() > 0) + { + firstHalfForTypes = true; + args.removeLast(); + args << appendTypeQueryPart(query, columnNames); + } + } + + // Execute query and handle results + DbAndroidConnection::ExecutionResult results; + QByteArray out; + QByteArray err; + bool res = adbManager->execBytes(args, &out, &err); + if (!res) + { + results.wasError = true; + results.errorMsg = tr("Could not execute query on database '%1': %2").arg(connectionUrl.getDbName(), AdbManager::decode(err)); + return results; + } + + if (out.startsWith("run-as:")) // means error + { + results.wasError = true; + results.errorMsg = tr("Could not execute query on database '%1': %2").arg(connectionUrl.getDbName(), AdbManager::decode(out).trimmed()); + return results; + } + + + QList> deserialized = CsvSerializer::deserialize(out, CSV_FORMAT); + if (deserialized.size() == 0) + return results; // no results + + extractResultData(deserialized, firstHalfForTypes, results); + return results; +} + +QStringList DbAndroidShellConnection::findColumns(const QStringList& originalArgs, const QString& query) +{ + static_qstring(colQueryTpl, "SELECT * FROM (%1) LIMIT 1"); + + QStringList tmpArgs = originalArgs; + QString tmpQuery = query.trimmed(); + if (tmpQuery.endsWith(";")) + tmpQuery.chop(1); + + tmpQuery = colQueryTpl.arg(tmpQuery); + + tmpArgs.removeLast(); + tmpArgs << tmpQuery; + + QString out; + QString err; + bool res = adbManager->exec(tmpArgs, &out, &err); + if (!res) + { + qCritical() << "Error querying columns in DbAndroidShellConnection::findColumns(): " << out << "\n" << err; + return QStringList(); + } + + QList deserialized = CsvSerializer::deserialize(out, CSV_FORMAT); + if (deserialized.size() < 1) + { + // There will be no results. + return QStringList(); + } + + return deserialized.first(); +} + +QString DbAndroidShellConnection::appendTypeQueryPart(const QString& query, const QStringList& columnNames) +{ + static_qstring(typeTpl, "typeof(%1)"); + static_qstring(hexTpl, "hex(%1) AS %1"); + static_qstring(finalQueryTpl, "SELECT %3 FROM (%2) UNION ALL SELECT %1 FROM (%2)"); + + QString tmpQuery = query.trimmed(); + if (tmpQuery.endsWith(";")) + tmpQuery.chop(1); + + QStringList hexColumns; + QStringList typeColumns; + QString wrappedCol; + for (const QString& colName : columnNames) + { + wrappedCol = wrapObjIfNeeded(colName, Dialect::Sqlite3); + typeColumns << typeTpl.arg(wrappedCol); + hexColumns << hexTpl.arg(wrappedCol); + } + + return finalQueryTpl.arg(typeColumns.join(", "), tmpQuery, hexColumns.join(", ")); +} + +void DbAndroidShellConnection::extractResultData(const QList>& deserialized, bool firstHalfForTypes, DbAndroidConnection::ExecutionResult& results) +{ + for (const QByteArray& cell : deserialized.first()) + results.resultColumns << AdbManager::decode(cell); + + QList> data = deserialized.mid(1); // first row are column names + QList> types; + if (firstHalfForTypes) + { + types = data.mid(data.size() / 2); + data = data.mid(0, data.size() / 2); + + QVariantList rowDataList; + QVariantHash rowDataMap; + QList rowData; + QList rowTypes; + QVariant value; + for (int rowIdx = 0, totalRows = data.size(); rowIdx < totalRows; ++rowIdx) + { + rowData = data[rowIdx]; + rowTypes = types[rowIdx]; + + rowDataList.clear(); + rowDataMap.clear(); + for (int i = 0, total = rowData.size(); i < total; ++i) + { + value = valueFromString(rowData[i], rowTypes[i]); + rowDataList << value; + rowDataMap[results.resultColumns[i]] = value; + } + results.resultDataList << rowDataList; + results.resultDataMap << rowDataMap; + } + } + else + { + QVariantList rowDataList; + QVariantHash rowDataMap; + for (const QList& row : data) + { + rowDataList.clear(); + rowDataMap.clear(); + for (int i = 0, total = row.size(); i < total; ++i) + { + rowDataList << AdbManager::decode(row[i]); + rowDataMap[results.resultColumns[i]] = row[i]; + } + results.resultDataList << rowDataList; + results.resultDataMap << rowDataMap; + } + } +} + +QVariant DbAndroidShellConnection::valueFromString(const QByteArray& bytes, const QByteArray& type) +{ + static const QStringList types = QStringList({"null", "integer", "real", "text", "blob"}); + + DataType dataType = static_cast(types.indexOf(AdbManager::decode(type))); + QByteArray decodedBytes = QByteArray::fromHex(bytes); + switch (dataType) + { + case DataType::BLOB: + return decodedBytes; + case DataType::INTEGER: + return QString::fromLatin1(decodedBytes).toLongLong(); + case DataType::REAL: + return QString::fromLatin1(decodedBytes).toDouble(); + case DataType::TEXT: + return QString::fromUtf8(decodedBytes); + case DataType::_NULL: + break; + case DataType::UNKNOWN: + qCritical() << "Unknown type passed to DbAndroidShellConnection::valueFromString():" << type; + break; + } + return QVariant(QString::null); +} + +void DbAndroidShellConnection::checkForDisconnection(const QStringList& devices) +{ + if (connected && !devices.contains(connectionUrl.getDevice())) + { + disconnectFromAndroid(); + emit disconnected(); + } +} + diff --git a/Plugins/DbAndroid/dbandroidshellconnection.h b/Plugins/DbAndroid/dbandroidshellconnection.h new file mode 100644 index 0000000..1c0ae0f --- /dev/null +++ b/Plugins/DbAndroid/dbandroidshellconnection.h @@ -0,0 +1,59 @@ +#ifndef DBANDROIDSHELLCONNECTION_H +#define DBANDROIDSHELLCONNECTION_H + +#include "dbandroidconnection.h" +#include "csvformat.h" + +#include + +class DbAndroid; +class AdbManager; + +class DbAndroidShellConnection : public DbAndroidConnection +{ + Q_OBJECT + + public: + DbAndroidShellConnection(DbAndroid* plugin, QObject *parent = 0); + ~DbAndroidShellConnection(); + + bool connectToAndroid(const DbAndroidUrl& url); + void disconnectFromAndroid(); + bool isConnected() const; + QString getDbName() const; + QStringList getDbList(); + QStringList getAppList(); + bool isAppOkay() const; + bool deleteDatabase(const QString& dbName); + ExecutionResult executeQuery(const QString& query); + + private: + enum class DataType + { + UNKNOWN = -1, + _NULL = 0, + INTEGER = 1, + REAL = 2, + TEXT = 3, + BLOB = 4 + }; + + QStringList findColumns(const QStringList& originalArgs, const QString& query); + QString appendTypeQueryPart(const QString& query, const QStringList& columnNames); + void extractResultData(const QList >& deserialized, bool firstHalfForTypes, ExecutionResult& results); + QVariant valueFromString(const QByteArray& bytes, const QByteArray& type); + + DbAndroid* plugin = nullptr; + AdbManager* adbManager = nullptr; + bool connected = false; + DbAndroidUrl connectionUrl; + bool appOkay = false; + mutable QMutex appOkMutex; + + static const CsvFormat CSV_FORMAT; + + private slots: + void checkForDisconnection(const QStringList& devices); +}; + +#endif // DBANDROIDSHELLCONNECTION_H diff --git a/Plugins/DbAndroid/dbandroidurl.cpp b/Plugins/DbAndroid/dbandroidurl.cpp new file mode 100644 index 0000000..766d810 --- /dev/null +++ b/Plugins/DbAndroid/dbandroidurl.cpp @@ -0,0 +1,217 @@ +#include "dbandroidurl.h" +#include "common/ipvalidator.h" +#include + +DbAndroidUrl::DbAndroidUrl() +{ +} + +DbAndroidUrl::DbAndroidUrl(DbAndroidMode enforcedMode) : + enforcedMode(enforcedMode) +{ +} + +DbAndroidUrl::DbAndroidUrl(const DbAndroidUrl& other) : + enforcedMode(other.enforcedMode), host(other.host), device(other.device), port(other.port), dbName(other.dbName), password(other.password), + application(other.application) +{ +} + +DbAndroidUrl::DbAndroidUrl(const QString& path, bool obfuscatedPassword) +{ + parse(path, obfuscatedPassword); +} + +DbAndroidUrl::~DbAndroidUrl() +{ +} + +QString DbAndroidUrl::toUrlString(bool obfuscatedPassword) const +{ + return toUrl(obfuscatedPassword).toString(); +} + +QUrl DbAndroidUrl::toUrl(bool obfuscatedPassword) const +{ + QUrl url; + url.setScheme(SCHEME); + url.setHost(host); + url.setUserName(device); + url.setPort(port); + url.setPassword(getPassword(obfuscatedPassword)); + url.setPath("/" + (application.isEmpty() ? "!" : application) + "/" + dbName); + return url; +} + +QString DbAndroidUrl::getDisplayName() const +{ + if (!device.isNull()) + return device; + + return host; +} + +void DbAndroidUrl::parse(const QString& path, bool obfuscatedPassword) +{ + QUrl url(path); + if (url.scheme() != SCHEME) + return; + + host = url.host(); + device = url.userName(); + port = url.port(); + + QString urlPath = url.path(); + if (urlPath.startsWith("/")) + urlPath = urlPath.mid(1); + + QStringList pathParts = urlPath.split("/"); + + application = QString(); + if (pathParts.first() != "!") + application = pathParts.first(); + + dbName = QStringList(pathParts.mid(1)).join("/"); + if (!url.password().isEmpty()) + setPassword(url.password(), obfuscatedPassword); + else + setPassword(QString()); +} + +QString DbAndroidUrl::getApplication() const +{ + return application; +} + +void DbAndroidUrl::setApplication(const QString& value) +{ + application = value; +} + +QString DbAndroidUrl::getDevice() const +{ + return device; +} + +void DbAndroidUrl::setDevice(const QString& value) +{ + device = value; +} + +QString DbAndroidUrl::getHost() const +{ + return host; +} + +void DbAndroidUrl::setHost(const QString& value) +{ + host = value; +} + + +QString DbAndroidUrl::getPassword(bool obfuscated) const +{ + if (obfuscated) + return QString::fromLatin1(password.toUtf8().toHex().toBase64()); + + return password; +} + +void DbAndroidUrl::setPassword(const QString& value, bool obfuscated) +{ + if (obfuscated) + { + password = QString::fromUtf8(QByteArray::fromHex(QByteArray::fromBase64(value.toLatin1()))); + return; + } + + password = value; +} + + +QString DbAndroidUrl::getDbName() const +{ + return dbName; +} + +void DbAndroidUrl::setDbName(const QString& value) +{ + dbName = value; +} + +DbAndroidMode DbAndroidUrl::getMode() const +{ + if (enforcedMode != DbAndroidMode::null) + return enforcedMode; + + if (!application.isEmpty()) + return DbAndroidMode::SHELL; + + return host.isEmpty() ? DbAndroidMode::USB : DbAndroidMode::NETWORK; +} + +void DbAndroidUrl::setEnforcedMode(DbAndroidMode mode) +{ + enforcedMode = mode; +} + +bool DbAndroidUrl::isValid(bool validateConnectionIrrelevantParts) const +{ + if (isNull()) + return false; + + if (validateConnectionIrrelevantParts && dbName.isEmpty()) + return false; + + switch (getMode()) + { + case DbAndroidMode::NETWORK: + { + if (!isHostValid()) + return false; + + if (port <= 0) + return false; + + break; + } + case DbAndroidMode::USB: + { + if (port <= 0) + return false; + + break; + } + case DbAndroidMode::SHELL: + { + if (validateConnectionIrrelevantParts && application.isEmpty()) + return false; + + break; + } + case DbAndroidMode::null: + return false; + } + + return true; +} + +bool DbAndroidUrl::isHostValid() const +{ + return IpValidator::check(host); +} + +bool DbAndroidUrl::isNull() const +{ + return host.isEmpty() && device.isEmpty(); +} + +int DbAndroidUrl::getPort() const +{ + return port; +} + +void DbAndroidUrl::setPort(int value) +{ + port = value; +} diff --git a/Plugins/DbAndroid/dbandroidurl.h b/Plugins/DbAndroid/dbandroidurl.h new file mode 100644 index 0000000..594b21c --- /dev/null +++ b/Plugins/DbAndroid/dbandroidurl.h @@ -0,0 +1,59 @@ +#ifndef DBANDROIDURL_H +#define DBANDROIDURL_H + +#include "dbandroidmode.h" +#include +#include + +class DbAndroidUrl +{ + public: + DbAndroidUrl(); + DbAndroidUrl(const DbAndroidUrl& other); + explicit DbAndroidUrl(DbAndroidMode enforcedMode); + explicit DbAndroidUrl(const QString& path, bool obfuscatedPassword = true); + ~DbAndroidUrl(); + + QString toUrlString(bool obfuscatedPassword = true) const; + QUrl toUrl(bool obfuscatedPassword = true) const; + QString getDisplayName() const; + + int getPort() const; + void setPort(int value); + + QString getDbName() const; + void setDbName(const QString& value); + + DbAndroidMode getMode() const; + void setEnforcedMode(DbAndroidMode mode); + bool isValid(bool validateConnectionIrrelevantParts = true) const; + bool isHostValid() const; + bool isNull() const; + + QString getPassword(bool obfuscated = false) const; + void setPassword(const QString& value, bool obfuscated = false); + + QString getHost() const; + void setHost(const QString& value); + + QString getDevice() const; + void setDevice(const QString& value); + + QString getApplication() const; + void setApplication(const QString& value); + + private: + void parse(const QString& path, bool obfuscatedPassword = false); + + static const constexpr char* SCHEME = "android"; + + DbAndroidMode enforcedMode = DbAndroidMode::null; + QString host; + QString device; + int port = -1; + QString dbName; + QString password; + QString application; +}; + +#endif // DBANDROIDURL_H diff --git a/Plugins/DbAndroid/sqlqueryandroid.cpp b/Plugins/DbAndroid/sqlqueryandroid.cpp new file mode 100644 index 0000000..08fe5cc --- /dev/null +++ b/Plugins/DbAndroid/sqlqueryandroid.cpp @@ -0,0 +1,160 @@ +#include "dbandroidconnection.h" +#include "sqlqueryandroid.h" +#include "sqlresultrowandroid.h" +#include "parser/lexer.h" +#include "db/sqlerrorcodes.h" +#include "common/utils_sql.h" +#include "log.h" +#include "dbandroidinstance.h" +#include + +SqlQueryAndroid::SqlQueryAndroid(DbAndroidInstance* db, DbAndroidConnection* connection, const QString& query) : + db(db), connection(connection), queryString(query) +{ + tokenizedQuery = Lexer::tokenize(query, Dialect::Sqlite3); +} + +SqlQueryAndroid::~SqlQueryAndroid() +{ +} + +QString SqlQueryAndroid::getErrorText() +{ + return errorText; +} + +int SqlQueryAndroid::getErrorCode() +{ + return errorCode; +} + +QStringList SqlQueryAndroid::getColumnNames() +{ + return resultColumns; +} + +int SqlQueryAndroid::columnCount() +{ + return resultColumns.size(); +} + +void SqlQueryAndroid::rewind() +{ + currentRow = -1; +} + +SqlResultsRowPtr SqlQueryAndroid::nextInternal() +{ + if (resultDataList.size() == 0) + return SqlResultsRowPtr(); + + currentRow++; + SqlResultRowAndroid* resultRow = new SqlResultRowAndroid(resultDataMap[currentRow], resultDataList[currentRow]); + return SqlResultsRowPtr(resultRow); +} + +bool SqlQueryAndroid::hasNextInternal() +{ + return (currentRow + 1 < resultDataList.size()); +} + +bool SqlQueryAndroid::execInternal(const QList& args) +{ + resetResponse(); + logSql(db, queryString, args, flags); + + int argIdx = 0; + QString query; + for (const TokenPtr& token : tokenizedQuery) + { + if (token->type != Token::BIND_PARAM) + { + query += token->value; + continue; + } + + query += convertArg(args[argIdx++]); + } + + return executeAndHandleResponse(query); +} + +bool SqlQueryAndroid::execInternal(const QHash& args) +{ + resetResponse(); + logSql(db, queryString, args, flags); + + QString argName; + QString query; + for (const TokenPtr& token : tokenizedQuery) + { + if (token->type != Token::BIND_PARAM) + { + query += token->value; + continue; + } + + argName = token->value; + if (!args.contains(argName)) + { + errorCode = SqlErrorCode::OTHER_EXECUTION_ERROR; + errorText = QObject::tr("Cannot bind argument '%1' of the query, because it's value is missing.").arg(argName); + return false; + } + + query += convertArg(args[argName]); + } + + return executeAndHandleResponse(query); +} + +QString SqlQueryAndroid::convertArg(const QVariant& value) +{ + if (value.isNull() || !value.isValid()) + return "NULL"; + + switch (value.type()) + { + case QVariant::Int: + case QVariant::UInt: + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Double: + return value.toString(); + case QVariant::String: + return "'" + value.toString().replace("'", "''") + "'"; + case QVariant::ByteArray: + return "x'" + value.toByteArray().toHex() + "'"; + default: + break; + } + + qCritical() << "Unhandled argument type in SqlQueryAndroid::convertArg():" << value.type(); + return ""; +} + +bool SqlQueryAndroid::executeAndHandleResponse(const QString& query) +{ + DbAndroidConnection::ExecutionResult results = connection->executeQuery(query); + if (results.wasError) + { + errorCode = (results.errorCode != 0) ? results.errorCode : SqlErrorCode::OTHER_EXECUTION_ERROR; + errorText = results.errorMsg; + return false; + } + + resultColumns = results.resultColumns; + resultDataMap = results.resultDataMap; + resultDataList = results.resultDataList; + return true; +} + +void SqlQueryAndroid::resetResponse() +{ + resultColumns.clear(); + resultDataMap.clear(); + resultDataList.clear(); + currentRow = -1; + errorCode = 0; + errorText = QString(); +} diff --git a/Plugins/DbAndroid/sqlqueryandroid.h b/Plugins/DbAndroid/sqlqueryandroid.h new file mode 100644 index 0000000..3944c21 --- /dev/null +++ b/Plugins/DbAndroid/sqlqueryandroid.h @@ -0,0 +1,47 @@ +#ifndef SQLQUERYANDROID_H +#define SQLQUERYANDROID_H + +#include "db/sqlquery.h" +#include "parser/token.h" +#include + +class DbAndroidConnection; +class DbAndroidInstance; + +class SqlQueryAndroid : public SqlQuery +{ + public: + SqlQueryAndroid(DbAndroidInstance* db, DbAndroidConnection* connection, const QString& query); + ~SqlQueryAndroid(); + + QString getErrorText(); + int getErrorCode(); + QStringList getColumnNames(); + int columnCount(); + void rewind(); + + protected: + SqlResultsRowPtr nextInternal(); + bool hasNextInternal(); + bool execInternal(const QList& args); + bool execInternal(const QHash& args); + + private: + bool executeAndHandleResponse(const QString& query); + void resetResponse(); + + static QString convertArg(const QVariant& value); + + DbAndroidInstance* db = nullptr; + DbAndroidConnection* connection = nullptr; + QString queryString; + TokenList tokenizedQuery; + int errorCode = 0; + QString errorText; + QStringList resultColumns; + QList resultDataMap; + QList resultDataList; + int currentRow = -1; +}; + +#endif // SQLQUERYANDROID_H diff --git a/Plugins/DbAndroid/sqlresultrowandroid.cpp b/Plugins/DbAndroid/sqlresultrowandroid.cpp new file mode 100644 index 0000000..cc08fa5 --- /dev/null +++ b/Plugins/DbAndroid/sqlresultrowandroid.cpp @@ -0,0 +1,12 @@ +#include "sqlresultrowandroid.h" + +SqlResultRowAndroid::SqlResultRowAndroid(const QVariantHash& resultMap, const QVariantList& resultList) +{ + valuesMap = resultMap; + values = resultList; +} + +SqlResultRowAndroid::~SqlResultRowAndroid() +{ +} + diff --git a/Plugins/DbAndroid/sqlresultrowandroid.h b/Plugins/DbAndroid/sqlresultrowandroid.h new file mode 100644 index 0000000..5acc95a --- /dev/null +++ b/Plugins/DbAndroid/sqlresultrowandroid.h @@ -0,0 +1,13 @@ +#ifndef SQLRESULTROWANDROID_H +#define SQLRESULTROWANDROID_H + +#include "db/sqlresultsrow.h" + +class SqlResultRowAndroid : public SqlResultsRow +{ + public: + SqlResultRowAndroid(const QVariantHash& resultMap, const QVariantList& resultList); + ~SqlResultRowAndroid(); +}; + +#endif // SQLRESULTROWANDROID_H diff --git a/Plugins/DbSqlite2/DbSqlite2.pro b/Plugins/DbSqlite2/DbSqlite2.pro index de31058..b254ca5 100644 --- a/Plugins/DbSqlite2/DbSqlite2.pro +++ b/Plugins/DbSqlite2/DbSqlite2.pro @@ -35,3 +35,4 @@ OTHER_FILES += \ + diff --git a/Plugins/HtmlExport/HtmlExport.pro b/Plugins/HtmlExport/HtmlExport.pro index 8f3578e..3ef30d0 100644 --- a/Plugins/HtmlExport/HtmlExport.pro +++ b/Plugins/HtmlExport/HtmlExport.pro @@ -29,7 +29,8 @@ FORMS += \ htmlexport.ui -TRANSLATIONS += HtmlExport_zh_CN.ts \ +TRANSLATIONS += HtmlExport_it.ts \ + HtmlExport_zh_CN.ts \ HtmlExport_sk.ts \ HtmlExport_de.ts \ HtmlExport_ru.ts \ @@ -49,3 +50,4 @@ TRANSLATIONS += HtmlExport_zh_CN.ts \ + diff --git a/Plugins/HtmlExport/HtmlExport_it.ts b/Plugins/HtmlExport/HtmlExport_it.ts new file mode 100644 index 0000000..208900c --- /dev/null +++ b/Plugins/HtmlExport/HtmlExport_it.ts @@ -0,0 +1,173 @@ + + + + + HtmlExport + + + SQL query results + + + + + + no type + + + + + + Exported table: %1 + + + + + + Table: %1 + + + + + virtual + + + + + Exported database: %1 + + + + + Index: %1 + + + + + For table: + + + + + Unique: + + + + + Yes + + + + + No + + + + + Column + + + + + Collating + + + + + Sort order + + + + + Trigger: %1 + + + + + Activated: + + + + + Action: + + + + + On view: + + + + + On table: + + + + + Activate condition: + + + + + Code executed: + + + + + View: %1 + + + + + Document generated by SQLiteStudio v%1 on %2 + + + + + HtmlExportConfig + + + Maximum number of characters per cell: + + + + + Include data types in first row + + + + + Column names as first row + + + + + Row numbers as first column + + + + + Output format + + + + + Format document (new lines, indentation) + + + + + Compress (everything in one line) + + + + + <p>When enabled, HTML characters such as &lt;, &gt; and &amp; are not escaped in exported values. This allows you for example to export hyper-link enabled documents, but it also may result in incorrect HTML document (unmatched pairs of &lt; and &gt; characters). Be warned.</p> + + + + + Don't escape HTML characters + + + + diff --git a/Plugins/JsonExport/JsonExport.pro b/Plugins/JsonExport/JsonExport.pro index 6f8ae18..47fcb05 100644 --- a/Plugins/JsonExport/JsonExport.pro +++ b/Plugins/JsonExport/JsonExport.pro @@ -28,7 +28,8 @@ RESOURCES += \ jsonexport.qrc -TRANSLATIONS += JsonExport_zh_CN.ts \ +TRANSLATIONS += JsonExport_it.ts \ + JsonExport_zh_CN.ts \ JsonExport_sk.ts \ JsonExport_de.ts \ JsonExport_ru.ts \ @@ -48,3 +49,4 @@ TRANSLATIONS += JsonExport_zh_CN.ts \ + diff --git a/Plugins/JsonExport/JsonExport_it.ts b/Plugins/JsonExport/JsonExport_it.ts new file mode 100644 index 0000000..74b0169 --- /dev/null +++ b/Plugins/JsonExport/JsonExport_it.ts @@ -0,0 +1,22 @@ + + + + + JsonExportConfig + + + Output format + + + + + Format document (new lines, indentation) + + + + + Compress (everything in one line) + + + + diff --git a/Plugins/JsonExport/JsonExport_zh_CN.ts b/Plugins/JsonExport/JsonExport_zh_CN.ts index be101c4..82b3b1d 100644 --- a/Plugins/JsonExport/JsonExport_zh_CN.ts +++ b/Plugins/JsonExport/JsonExport_zh_CN.ts @@ -6,17 +6,17 @@ Output format - + 输出格式 Format document (new lines, indentation) - + 格式化的文本(多行,缩进) Compress (everything in one line) - + 压缩(产生单行文件) diff --git a/Plugins/PdfExport/PdfExport.pro b/Plugins/PdfExport/PdfExport.pro index ff86d24..95848c1 100644 --- a/Plugins/PdfExport/PdfExport.pro +++ b/Plugins/PdfExport/PdfExport.pro @@ -26,7 +26,8 @@ RESOURCES += \ pdfexport.qrc -TRANSLATIONS += PdfExport_zh_CN.ts \ +TRANSLATIONS += PdfExport_it.ts \ + PdfExport_zh_CN.ts \ PdfExport_sk.ts \ PdfExport_de.ts \ PdfExport_ru.ts \ @@ -46,3 +47,4 @@ TRANSLATIONS += PdfExport_zh_CN.ts \ + diff --git a/Plugins/PdfExport/PdfExport_de.ts b/Plugins/PdfExport/PdfExport_de.ts index 7e5d8e6..7498c43 100644 --- a/Plugins/PdfExport/PdfExport_de.ts +++ b/Plugins/PdfExport/PdfExport_de.ts @@ -6,164 +6,165 @@ SQLiteStudio v%1 - + SQLiteStudio v%1 SQL query results - + SQL Abfragenergebnis Exported table: %1 - + Exportierte Tabelle: %1 Table: %1 - + Tabelle: %1 Column - + Spalte Data type - + Datentyp Constraints - + Bedingungen Global table constraints - + Globale Tabellenbedingungen Exported database: %1 - + Exportierte Datenbank: %1 Index: %1 - + Index: %1 Property index header - + Eigenschaft Value index header - + Wert Indexed table - + Indexierte Tabelle Unique index - + Singularer Index? Fuer Unique finde ich keine richtige Übersetzung. + Index (duplikatfrei) Yes - + Ja No - + Nein Collation - + Kollation Sort order - + Sortierreihenfolge Partial index condition - + Teilindexbedingung Trigger: %1 - + Trigger: %1 Property trigger header - + Eigenschaft Value trigger header - + Wert Activation time - + Ausführungszeit For action - + Für Aktion On view - + auf Index On table - + auf Tabelle Activation condition - + Ausführungskondition Code executed - + Code ausgeführt View: %1 - + View: %1 Query: - + Abfrage: Document generated with SQLiteStudio v%1 - + Dokument mit SQLiteStudio v%1 generiert @@ -171,32 +172,33 @@ Size and layout - + Format und Layout Page size: - + Format: + Right margin: - + Seitenabstand Rechts: Left margin: - + Seitenabstand Links: Cell padding: - + Zellenabstand: Limit characters in single cell: - + Maximale Anzahl an Zeichen pro Zelle: @@ -205,52 +207,52 @@ mm - + mm Bottom margin: - + Seitenabstand Unten: Top margin: - + Seitenabstand oben: Font - + Schriftart Colors - + Farben Headers background: - + Hintergrundfarbe Kopfzeile: NULL value color: - + NULL Wert Farbe: Other settings - + Sonstige Einstellungen Print row numbers for data - + Zeilennummerierung drucken Print page numbers - + Seitenzahl drucken diff --git a/Plugins/PdfExport/PdfExport_it.ts b/Plugins/PdfExport/PdfExport_it.ts new file mode 100644 index 0000000..913432b --- /dev/null +++ b/Plugins/PdfExport/PdfExport_it.ts @@ -0,0 +1,256 @@ + + + + + PdfExport + + + SQLiteStudio v%1 + + + + + SQL query results + + + + + + Exported table: %1 + + + + + + Table: %1 + + + + + + Column + + + + + Data type + + + + + Constraints + + + + + Global table constraints + + + + + Exported database: %1 + + + + + Index: %1 + + + + + Property + index header + + + + + Value + index header + + + + + Indexed table + + + + + Unique index + + + + + Yes + + + + + No + + + + + Collation + + + + + Sort order + + + + + Partial index condition + + + + + Trigger: %1 + + + + + Property + trigger header + + + + + Value + trigger header + + + + + Activation time + + + + + For action + + + + + On view + + + + + On table + + + + + Activation condition + + + + + Code executed + + + + + View: %1 + + + + + Query: + + + + + Document generated with SQLiteStudio v%1 + + + + + PdfExportConfig + + + Size and layout + + + + + Page size: + + + + + Right margin: + + + + + Left margin: + + + + + Cell padding: + + + + + Limit characters in single cell: + + + + + + + + + mm + + + + + Bottom margin: + + + + + Top margin: + + + + + Font + + + + + Colors + + + + + Headers background: + + + + + NULL value color: + + + + + Other settings + + + + + Print row numbers for data + + + + + Print page numbers + + + + diff --git a/Plugins/Plugins.pro b/Plugins/Plugins.pro index 805521a..81b2337 100644 --- a/Plugins/Plugins.pro +++ b/Plugins/Plugins.pro @@ -16,4 +16,5 @@ SUBDIRS += \ Printing \ SqlEnterpriseFormatter \ ConfigMigration \ - ScriptingTcl + ScriptingTcl \ + DbAndroid diff --git a/Plugins/Printing/Printing.pro b/Plugins/Printing/Printing.pro index c1afb9f..5006d60 100644 --- a/Plugins/Printing/Printing.pro +++ b/Plugins/Printing/Printing.pro @@ -35,7 +35,8 @@ RESOURCES += \ printing.qrc -TRANSLATIONS += Printing_zh_CN.ts \ +TRANSLATIONS += Printing_it.ts \ + Printing_zh_CN.ts \ Printing_sk.ts \ Printing_de.ts \ Printing_ru.ts \ @@ -55,3 +56,4 @@ TRANSLATIONS += Printing_zh_CN.ts \ + diff --git a/Plugins/Printing/Printing_de.ts b/Plugins/Printing/Printing_de.ts index 6a165a2..fb45beb 100644 --- a/Plugins/Printing/Printing_de.ts +++ b/Plugins/Printing/Printing_de.ts @@ -6,27 +6,27 @@ Print data - + Daten drucken Print query - + Abfrage drucken No data to print. - + Keine Daten, die gedruckt werden müssen. Printing data. - + Drucke Daten. Printing query. - + Drucke Abfrage. @@ -34,7 +34,7 @@ Printing - + Drucken diff --git a/Plugins/Printing/Printing_it.ts b/Plugins/Printing/Printing_it.ts new file mode 100644 index 0000000..0a21af2 --- /dev/null +++ b/Plugins/Printing/Printing_it.ts @@ -0,0 +1,40 @@ + + + + + Printing + + + Print data + + + + + Print query + + + + + No data to print. + + + + + Printing data. + + + + + Printing query. + + + + + PrintingExport + + + Printing + + + + diff --git a/Plugins/Printing/Printing_zh_CN.ts b/Plugins/Printing/Printing_zh_CN.ts index 0b1b255..e3a7a2d 100644 --- a/Plugins/Printing/Printing_zh_CN.ts +++ b/Plugins/Printing/Printing_zh_CN.ts @@ -6,27 +6,27 @@ Print data - + 打印数据 Print query - + 打印 query No data to print. - + 没有数据可打印。 Printing data. - + 打印数据中。 Printing query. - + 打印query中。 @@ -34,7 +34,7 @@ Printing - + 打印 diff --git a/Plugins/RegExpImport/RegExpImport.pro b/Plugins/RegExpImport/RegExpImport.pro index aa790b2..8ef5298 100644 --- a/Plugins/RegExpImport/RegExpImport.pro +++ b/Plugins/RegExpImport/RegExpImport.pro @@ -28,7 +28,8 @@ RESOURCES += \ regexpimport.qrc -TRANSLATIONS += RegExpImport_zh_CN.ts \ +TRANSLATIONS += RegExpImport_it.ts \ + RegExpImport_zh_CN.ts \ RegExpImport_sk.ts \ RegExpImport_de.ts \ RegExpImport_ru.ts \ @@ -48,3 +49,4 @@ TRANSLATIONS += RegExpImport_zh_CN.ts \ + diff --git a/Plugins/RegExpImport/RegExpImport_it.ts b/Plugins/RegExpImport/RegExpImport_it.ts new file mode 100644 index 0000000..00869f1 --- /dev/null +++ b/Plugins/RegExpImport/RegExpImport_it.ts @@ -0,0 +1,83 @@ + + + + + RegExpImport + + + Text files (*.txt);;All files (*) + + + + + Cannot read file %1 + + + + + Enter the regular expression pattern. + + + + + Invalid pattern: %1 + + + + + Requested capture index %1 is out of range. + + + + + <p>Requested capture group name '%1', but it's not defined in the pattern: <pre>%2</pre></p> + + + + + RegExpImportConfig + + + Capture groups + + + + + Treat all RegExp capture groups as columns + + + + + Import only following groups: + + + + + <p>Enter comma separated list of capture group indexes. The 0 index refers to the entire matched string.</p> +<p>If you used named groups in the pattern, you can use names instead of indexes. You can mix indexes and names in this list.</p> + + + + + Example: 1, 3, 4 + + + + + Pattern: + + + + + <p>Use Regular Expression groups to enclose parts of the expression that you want to import. If you want to use a group, that you don't want to import, then use "import only following groups" option below. + +You can use named groups and refer to them in group list below. To name a group use: <pre>(?&lt;myGroupName&gt;\s+\d+\s+)</pre></p> + + + + + Example: (\d+)\s+((\d+)\w+)\s+(\w+) + + + + diff --git a/Plugins/ScriptingTcl/ScriptingTcl.pro b/Plugins/ScriptingTcl/ScriptingTcl.pro index fc5cf5b..d888a32 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl.pro +++ b/Plugins/ScriptingTcl/ScriptingTcl.pro @@ -37,6 +37,10 @@ linux: { TCL_CONFIG_DIR = $$system(echo "puts [info library]" | tclsh) TCL_CONFIG = $$TCL_CONFIG_DIR/tclConfig.sh message("Looking for $$TCL_CONFIG") + !exists($$TCL_CONFIG) { + TCL_CONFIG = $$TCL_CONFIG_DIR/../tclConfig.sh + message("Looking for $$TCL_CONFIG") + } !exists($$TCL_CONFIG) { # Debian case DEBIAN_ARCH_PATH=$$system(dpkg-architecture -qDEB_HOST_MULTIARCH) @@ -138,7 +142,8 @@ RESOURCES += \ scriptingtcl.qrc -TRANSLATIONS += ScriptingTcl_zh_CN.ts \ +TRANSLATIONS += ScriptingTcl_it.ts \ + ScriptingTcl_zh_CN.ts \ ScriptingTcl_sk.ts \ ScriptingTcl_de.ts \ ScriptingTcl_ru.ts \ @@ -158,3 +163,4 @@ TRANSLATIONS += ScriptingTcl_zh_CN.ts \ + diff --git a/Plugins/ScriptingTcl/ScriptingTcl_it.ts b/Plugins/ScriptingTcl/ScriptingTcl_it.ts new file mode 100644 index 0000000..dc735d6 --- /dev/null +++ b/Plugins/ScriptingTcl/ScriptingTcl_it.ts @@ -0,0 +1,22 @@ + + + + + ScriptingTcl + + + No database available in current context, while called Tcl's '%1' command. + + + + + Invalid '%1' command sytax. Should be: %2 + + + + + Error from Tcl's' '%1' command: %2 + + + + diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter.pro b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter.pro index 965767b..5af5bfa 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter.pro +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter.pro @@ -100,7 +100,8 @@ RESOURCES += \ sqlenterpriseformatter.qrc -TRANSLATIONS += SqlEnterpriseFormatter_zh_CN.ts \ +TRANSLATIONS += SqlEnterpriseFormatter_it.ts \ + SqlEnterpriseFormatter_zh_CN.ts \ SqlEnterpriseFormatter_sk.ts \ SqlEnterpriseFormatter_de.ts \ SqlEnterpriseFormatter_ru.ts \ @@ -120,3 +121,4 @@ TRANSLATIONS += SqlEnterpriseFormatter_zh_CN.ts \ + diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts index a83f5df..37751d0 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper @@ -200,7 +200,32 @@ - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts index 4d873e5..b0b5eed 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper @@ -200,7 +200,32 @@ - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts index 8a9178b..d0e62f7 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper Nom @@ -200,7 +200,32 @@ Mots clé en majuscule - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview Aperçu diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_it.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_it.ts new file mode 100644 index 0000000..9e721a4 --- /dev/null +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_it.ts @@ -0,0 +1,233 @@ + + + + + QObject + + + + name + example name wrapper + + + + + SqlEnterpriseFormatter + + + Indentation + + + + + Line up keywords in multi-line queries + + + + + Indent contents of parenthesis block + + + + + Tab size: + + + + + New lines + + + + + Before opening parenthesis in column definitions + + + + + After opening parenthesis in column definitions + + + + + Before closing parenthesis in column definitions + + + + + After closing parenthesis in column definitions + + + + + Before opening parenthesis in expressions + + + + + After opening parenthesis in expressions + + + + + Before closing parenthesis in expressions + + + + + After closing parenthesis in expressions + + + + + After JOIN keywords in FROM clause + + + + + Put each column constraint in CREATE TABLE into new line + + + + + After comma + + + + + After comma in expressions + + + + + After semicolon + + + + + + Never before semicolon + + + + + White spaces + + + + + Before comma in lists + + + + + After comma in lists + + + + + Before opening parenthesis + + + + + After opening parenthesis + + + + + Before closing parenthesis + + + + + After closing parenthesis + + + + + No space between SQL function name and opening parenthesis + + + + + Before dot operator (in path to database object) + + + + + After dot operator (in path to database object) + + + + + Before mathematical operator + + + + + After mathematical operator + + + + + Never before comma + + + + + Names + + + + + Preferred name wrapper + + + + + Always use name wrapping + + + + + Uppercase data type names + + + + + Uppercase keywords + + + + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + + Preview + + + + diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts index 5cfbf32..2c03a46 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper nazwa @@ -201,7 +201,32 @@ Zmieniaj litery słów kluczowych na duże - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview Podgląd diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts index b89804a..a408ffc 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper @@ -200,7 +200,32 @@ - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts index a5656d8..4e5e98d 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts @@ -1,11 +1,11 @@ - + QObject - - + + name example name wrapper имя @@ -200,7 +200,32 @@ Приводить ключевые слова к верхнему регистру - + + Comments + Комментарии + + + + Preferred comment marker (where possible): + Предпочитаемый символ комментирования (где применимо): + + + + SqlEnterpriseFormatter.CommentMarkers + SqlEnterpriseFormatter.CommentMarkers + + + + Move all comments to the line end + Перемещать все комментарии в конец строки + + + + Line up comments at the line end + Выравнивать комментарии в конце строки + + + Preview Предпросмотр diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts index 407cc6e..37a42a4 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper @@ -200,7 +200,32 @@ - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts index 3c80603..d1a361b 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts @@ -4,8 +4,8 @@ QObject - - + + name example name wrapper @@ -200,7 +200,32 @@ - + + Comments + + + + + Preferred comment marker (where possible): + + + + + SqlEnterpriseFormatter.CommentMarkers + + + + + Move all comments to the line end + + + + + Line up comments at the line end + + + + Preview diff --git a/Plugins/SqlEnterpriseFormatter/formatempty.cpp b/Plugins/SqlEnterpriseFormatter/formatempty.cpp index 976694e..d0696e0 100644 --- a/Plugins/SqlEnterpriseFormatter/formatempty.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatempty.cpp @@ -1,8 +1,9 @@ #include "formatempty.h" +#include "common/unused.h" -FormatEmpty::FormatEmpty(SqliteEmptyQuery* eq) : - eq(eq) +FormatEmpty::FormatEmpty(SqliteEmptyQuery* eq) { + UNUSED(eq); } void FormatEmpty::formatInternal() diff --git a/Plugins/SqlEnterpriseFormatter/formatempty.h b/Plugins/SqlEnterpriseFormatter/formatempty.h index 3279925..2fa3d01 100644 --- a/Plugins/SqlEnterpriseFormatter/formatempty.h +++ b/Plugins/SqlEnterpriseFormatter/formatempty.h @@ -12,9 +12,6 @@ class FormatEmpty : public FormatStatement protected: void formatInternal(); - - private: - SqliteEmptyQuery* eq = nullptr; }; #endif // FORMATEMPTY_H diff --git a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.cpp b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.cpp index 8f75960..a08f95c 100644 --- a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.cpp +++ b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.cpp @@ -3,6 +3,7 @@ #include "common/unused.h" #include "common/global.h" #include +#include #include SqlEnterpriseFormatter::SqlEnterpriseFormatter() @@ -11,6 +12,8 @@ SqlEnterpriseFormatter::SqlEnterpriseFormatter() QString SqlEnterpriseFormatter::format(SqliteQueryPtr query) { + QList comments = collectComments(query->tokens); + int wrapperIdx = cfg.SqlEnterpriseFormatter.Wrappers.get().indexOf(cfg.SqlEnterpriseFormatter.PrefferedWrapper.get()); NameWrapper wrapper = getAllNameWrappers()[wrapperIdx]; @@ -24,7 +27,11 @@ QString SqlEnterpriseFormatter::format(SqliteQueryPtr query) QString formatted = formatStmt->format(); delete formatStmt; - return formatted; + QString formattedWithComments = applyComments(formatted, comments, query->dialect); + for (Comment* c : comments) + delete c; + + return formattedWithComments; } bool SqlEnterpriseFormatter::init() @@ -34,7 +41,9 @@ bool SqlEnterpriseFormatter::init() static_qstring(query1, "SELECT (2 + 4) AND (3 + 5), 4 NOT IN (SELECT t1.'some[_]name' + t2.[some'name2] FROM xyz t1 JOIN zxc t2 ON (t1.aaa = t2.aaa)) " "FROM a, (SELECT id FROM table2);"); static_qstring(query2, "INSERT INTO table1 (id, value1, value2) VALUES (1, (2 + 5), (SELECT id FROM table2));"); - static_qstring(query3, "CREATE TABLE tab (id INTEGER PRIMARY KEY, value1 VARCHAR(6), value2 NUMBER(8,2) NOT NULL DEFAULT 1.0);"); + static_qstring(query3, "CREATE TABLE tab (id INTEGER PRIMARY KEY, /*a primary key column*/ value1 VARCHAR(6), " + "value2 /*column with constraints*/ NUMBER(8,2) NOT NULL DEFAULT 1.0" + ");"); static_qstring(query4, "CREATE UNIQUE INDEX IF NOT EXISTS dbName.idx1 ON [messages column] (id COLLATE x ASC, lang DESC, description);"); Parser parser(Dialect::Sqlite3); @@ -110,3 +119,196 @@ void SqlEnterpriseFormatter::configDialogClosed() { disconnect(&cfg.SqlEnterpriseFormatter, SIGNAL(changed(CfgEntry*)), this, SLOT(configModified(CfgEntry*))); } + +QList SqlEnterpriseFormatter::collectComments(const TokenList &tokens) +{ + QList results; + + QList tokensInLines = tokensByLines(tokens); + Comment* prevCommentInThisLine = nullptr; + Comment* cmt = nullptr; + bool tokensBefore = false; + int pos = 0; + int line = 0; + for (const TokenList& tokensInLine : tokensInLines) + { + tokensBefore = true; + prevCommentInThisLine = nullptr; + for (const TokenPtr& token : tokensInLine) + { + if (token->type == Token::Type::SPACE) + continue; + + if (prevCommentInThisLine) + prevCommentInThisLine->tokensAfter = true; + + if (token->type == Token::Type::COMMENT) + { + cmt = new Comment; + cmt->tokensBefore = tokensBefore; + cmt->position = pos; + cmt->multiline = token->value.startsWith("/*"); + if (cmt->multiline) + cmt->contents = token->value.mid(2, token->value.length() - 4).trimmed(); + else + cmt->contents = token->value.mid(2).trimmed(); + + results << cmt; + prevCommentInThisLine = cmt; + continue; + } + + tokensBefore = true; + pos++; + } + line++; + } + + return results; +} + +QList SqlEnterpriseFormatter::tokensByLines(const TokenList &tokens, bool includeSpaces) +{ + QList tokensInLines; + TokenList tokensInLine; + for (const TokenPtr& token : tokens) + { + if (includeSpaces || token->type != Token::Type::SPACE) + tokensInLine << token; + + if (token->type == Token::Type::SPACE && token->value.contains('\n')) + { + tokensInLines << tokensInLine; + tokensInLine.clear(); + } + } + if (tokensInLine.size() > 0) + tokensInLines << tokensInLine; + + return tokensInLines; +} + +TokenList SqlEnterpriseFormatter::adjustCommentsToEnd(const TokenList &inputTokens) +{ + QList tokensInLines = tokensByLines(inputTokens, true); + TokenList newTokens; + TokenList commentTokensForLine; + TokenPtr newLineToken; + for (const TokenList& tokensInLine : tokensInLines) + { + commentTokensForLine.clear(); + newLineToken.clear(); + for (const TokenPtr& token : tokensInLine) + { + if (token->type == Token::Type::COMMENT) + { + wrapComment(token, true); + //token->value = " " + endLineCommentTpl.arg(token->value); + commentTokensForLine << token; + } + else if (token->type == Token::Type::SPACE && token->value.contains("\n")) + newLineToken = token; + else + newTokens << token; + } + + newTokens += commentTokensForLine; + if (newLineToken) + newTokens << newLineToken; + } + return newTokens; +} + +TokenList SqlEnterpriseFormatter::wrapOnlyComments(const TokenList &inputTokens) +{ + QList tokensInLines = tokensByLines(inputTokens, true); + TokenList newTokens; + bool lineEnd = true; + for (const TokenList& tokensInLine : reverse(tokensInLines)) + { + lineEnd = true; + for (const TokenPtr& token : reverse(tokensInLine)) + { + if (!token->isWhitespace()) + lineEnd = false; + + if (token->type == Token::Type::COMMENT) + wrapComment(token, lineEnd); + + newTokens << token; + } + } + return reverse(newTokens); +} + +TokenList SqlEnterpriseFormatter::optimizeInnerComments(const TokenList &inputTokens) +{ + // TODO + return inputTokens; +} + +TokenList SqlEnterpriseFormatter::optimizeEndLineComments(const TokenList &inputTokens) +{ + // TODO + return inputTokens; +} + +void SqlEnterpriseFormatter::indentMultiLineComments(const TokenList &inputTokens) +{ + // TODO +} + +void SqlEnterpriseFormatter::wrapComment(const TokenPtr &token, bool isAtLineEnd) +{ + static_qstring(multiCommentTpl, "/* %1 */"); + static_qstring(endLineCommentTpl, "-- %1"); + + bool isMultiLine = token->value.contains("\n"); + if (isAtLineEnd && !isMultiLine && cfg.SqlEnterpriseFormatter.PreferredCommentMarker.get() == "--") + token->value = endLineCommentTpl.arg(token->value); + else + token->value = multiCommentTpl.arg(token->value); +} + +QString SqlEnterpriseFormatter::applyComments(const QString& formatted, QList comments, Dialect dialect) +{ + if (comments.size() == 0) + return formatted; + + int currentCommentPosition = comments.first()->position; + + TokenList allTokens = Lexer::tokenize(formatted, dialect); + TokenList newTokens; + int currentTokenPosition = 0; + for (const TokenPtr& token : allTokens) + { + if (currentTokenPosition == currentCommentPosition) + { + newTokens << TokenPtr::create(Token::Type::COMMENT, comments.first()->contents); + comments.removeFirst(); + if (comments.size() > 0) + currentCommentPosition = comments.first()->position; + else + currentCommentPosition = -1; + } + + newTokens << token; + if (token->type != Token::Type::SPACE) + currentTokenPosition++; + } + + // Any remaining comments + for (Comment* cmt : comments) + newTokens << TokenPtr::create(Token::Type::COMMENT, cmt->contents); + + if (cfg.SqlEnterpriseFormatter.MoveAllCommentsToLineEnd.get()) + newTokens = adjustCommentsToEnd(newTokens); + else + newTokens = wrapOnlyComments(newTokens); + + newTokens = optimizeInnerComments(newTokens); + newTokens = optimizeEndLineComments(newTokens); + indentMultiLineComments(newTokens); + + return newTokens.detokenize(); +} diff --git a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.h b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.h index 2701745..1f9b6d8 100644 --- a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.h +++ b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.h @@ -53,6 +53,10 @@ CFG_CATEGORIES(SqlEnterpriseFormatterConfig, CFG_ENTRY(QString, PrefferedWrapper, getNameWrapperStr(NameWrapper::BRACKET)) CFG_ENTRY(QStringList, Wrappers, getNameWrapperStrings(), false) CFG_ENTRY(QString, PreviewCode, QString(), false) + CFG_ENTRY(bool, MoveAllCommentsToLineEnd, false) + CFG_ENTRY(bool, LineUpCommentsAtLineEnd, true) + CFG_ENTRY(QString, PreferredCommentMarker, "--") + CFG_ENTRY(QStringList, CommentMarkers, QStringList({"--", "/* */"})) ) ) @@ -73,6 +77,25 @@ class SQLENTERPRISEFORMATTERSHARED_EXPORT SqlEnterpriseFormatter : public Generi void configDialogClosed(); private: + struct Comment + { + int position = 0; + QString contents; + bool tokensBefore = false; + bool tokensAfter = false; + bool multiline = false; + }; + + QList collectComments(const TokenList& tokens); + QString applyComments(const QString& formatted, QList comments, Dialect dialect); + QList tokensByLines(const TokenList& tokens, bool includeSpaces = false); + TokenList adjustCommentsToEnd(const TokenList& inputTokens); + TokenList wrapOnlyComments(const TokenList& inputTokens); + TokenList optimizeInnerComments(const TokenList& inputTokens); + TokenList optimizeEndLineComments(const TokenList& inputTokens); + void indentMultiLineComments(const TokenList& inputTokens); + void wrapComment(const TokenPtr& token, bool isAtLineEnd); + QList previewQueries; CFG_LOCAL_PERSISTABLE(SqlEnterpriseFormatterConfig, cfg) diff --git a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.ui b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.ui index 2ebfbdf..b21de64 100644 --- a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.ui +++ b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.ui @@ -39,7 +39,7 @@ - 1 + 0 @@ -133,9 +133,9 @@ 0 - -166 - 578 - 350 + 0 + 390 + 299 @@ -366,8 +366,8 @@ 0 0 - 424 - 325 + 418 + 278 @@ -626,6 +626,63 @@ + + + Comments + + + + + + Preferred comment marker (where possible): + + + + + + + SqlEnterpriseFormatter.PreferredCommentMarker + + + SqlEnterpriseFormatter.CommentMarkers + + + + + + + Move all comments to the line end + + + SqlEnterpriseFormatter.MoveAllCommentsToLineEnd + + + + + + + Line up comments at the line end + + + SqlEnterpriseFormatter.LineUpCommentsAtLineEnd + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + diff --git a/Plugins/SqlExport/SqlExport.pro b/Plugins/SqlExport/SqlExport.pro index 30e4632..eb18a7c 100644 --- a/Plugins/SqlExport/SqlExport.pro +++ b/Plugins/SqlExport/SqlExport.pro @@ -29,7 +29,8 @@ RESOURCES += \ sqlexport.qrc -TRANSLATIONS += SqlExport_zh_CN.ts \ +TRANSLATIONS += SqlExport_it.ts \ + SqlExport_zh_CN.ts \ SqlExport_sk.ts \ SqlExport_de.ts \ SqlExport_ru.ts \ @@ -49,3 +50,4 @@ TRANSLATIONS += SqlExport_zh_CN.ts \ + diff --git a/Plugins/SqlExport/SqlExport_it.ts b/Plugins/SqlExport/SqlExport_it.ts new file mode 100644 index 0000000..7f5368b --- /dev/null +++ b/Plugins/SqlExport/SqlExport_it.ts @@ -0,0 +1,98 @@ + + + + + SqlExport + + + -- Results of query: + + + + + -- Table: %1 + + + + + -- Index: %1 + + + + + -- Trigger: %1 + + + + + -- View: %1 + + + + + -- File generated with SQLiteStudio v%1 on %2 + + + + + -- Text encoding used: %1 + + + + + Table name for INSERT statements is mandatory. + + + + + sqlExportCommonConfig + + + Generate "DROP IF EXISTS" statement before "CREATE" statement + + + + + Format DDL statements only (excludes "INSERT" statements) + + + + + Use SQL formatter to format exported SQL statements + + + + + sqlExportQueryConfig + + + Use SQL formatter to format exported SQL statements + + + + + Table name to use for INSERT statements: + + + + + Generate "CREATE TABLE" statement at the begining + + + + + Include the query in comments + + + + + Generate "DROP IF EXISTS" statement before "CREATE" statement + + + + + Format DDL statements only (excludes "INSERT" statements) + + + + diff --git a/Plugins/SqlExport/SqlExport_zh_CN.ts b/Plugins/SqlExport/SqlExport_zh_CN.ts index d29cae8..c6c72de 100644 --- a/Plugins/SqlExport/SqlExport_zh_CN.ts +++ b/Plugins/SqlExport/SqlExport_zh_CN.ts @@ -6,37 +6,37 @@ -- Results of query: - + -- 执行结果: -- Table: %1 - + -- 表:%1 -- Index: %1 - + -- 索引:%1 -- Trigger: %1 - + -- 触发器:%1 -- View: %1 - + -- 视图:%1 -- File generated with SQLiteStudio v%1 on %2 - + -- 由SQLiteStudio v%1 产生的文件 %2 -- Text encoding used: %1 - + -- 文本编码:%1 diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple.pro b/Plugins/SqlFormatterSimple/SqlFormatterSimple.pro index 61ec27a..7329f93 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple.pro +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple.pro @@ -28,7 +28,8 @@ RESOURCES += \ sqlformattersimple.qrc -TRANSLATIONS += SqlFormatterSimple_zh_CN.ts \ +TRANSLATIONS += SqlFormatterSimple_it.ts \ + SqlFormatterSimple_zh_CN.ts \ SqlFormatterSimple_sk.ts \ SqlFormatterSimple_de.ts \ SqlFormatterSimple_ru.ts \ @@ -48,3 +49,4 @@ TRANSLATIONS += SqlFormatterSimple_zh_CN.ts \ + diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_it.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_it.ts new file mode 100644 index 0000000..91208f1 --- /dev/null +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_it.ts @@ -0,0 +1,17 @@ + + + + + SqlFormatterSimplePlugin + + + Upper case keywords + + + + + Reduce multiple whitespaces to single whitespace + + + + diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts index aaa7f79..40c7f1e 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts @@ -6,12 +6,12 @@ Upper case keywords - + 大写关键字 Reduce multiple whitespaces to single whitespace - + 将多个空白转换为一个空白 diff --git a/Plugins/XmlExport/XmlExport.pro b/Plugins/XmlExport/XmlExport.pro index e22c320..bf34076 100644 --- a/Plugins/XmlExport/XmlExport.pro +++ b/Plugins/XmlExport/XmlExport.pro @@ -27,7 +27,8 @@ RESOURCES += \ xmlexport.qrc -TRANSLATIONS += XmlExport_zh_CN.ts \ +TRANSLATIONS += XmlExport_it.ts \ + XmlExport_zh_CN.ts \ XmlExport_sk.ts \ XmlExport_de.ts \ XmlExport_ru.ts \ @@ -47,3 +48,4 @@ TRANSLATIONS += XmlExport_zh_CN.ts \ + diff --git a/Plugins/XmlExport/XmlExport_it.ts b/Plugins/XmlExport/XmlExport_it.ts new file mode 100644 index 0000000..58265f6 --- /dev/null +++ b/Plugins/XmlExport/XmlExport_it.ts @@ -0,0 +1,70 @@ + + + + + XmlExport + + + Enter the namespace to use (for example: http://my.namespace.org) + + + + + XmlExportConfig + + + Output format + + + + + Format document (new lines, indentation) + + + + + Compress (everything in one line) + + + + + Special characters escaping + + + + + <p>Ampersands will be used for shorter values and CDATA will be used for larger values. This applies only to values that require character escaping. Other values will be exported as they are.</p> + + + + + Use CDATA and ampersands + + + + + <p>Every value requiring character escepe will be enclosed in CDATA block.</p> + + + + + Always use CDATA + + + + + <p>Every character that require esceping will be replaced with its ampersand escape sequence. No CDATA blocks will be used.</p> + + + + + Always use ampersand + + + + + Define XML namespace + + + + diff --git a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp index cd8c4b2..4cec515 100644 --- a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp +++ b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp @@ -20,6 +20,7 @@ class ParserTest : public QObject Parser* parser3 = nullptr; private Q_SLOTS: + void testUniqConflict(); void testGetTableTokens(); void testGetTableTokens2(); void testGetDatabaseTokens(); @@ -354,6 +355,16 @@ void ParserTest::testBigNum() QVERIFY(res); } +void ParserTest::testUniqConflict() +{ + QString sql = "CREATE TABLE test (x UNIQUE ON CONFLICT FAIL);"; + bool res = parser3->parse(sql); + QVERIFY(res); + SqliteQueryPtr q = parser3->getQueries().first(); + TokenList tokens = q->tokens; + QVERIFY(tokens[16]->type == Token::Type::PAR_RIGHT); +} + void ParserTest::initTestCase() { initKeywords(); diff --git a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt index a94955a..38c2289 100644 --- a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt +++ b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt @@ -1,3 +1,12 @@ +[3.0.7] + * [ADDED]: #2951 Implemented dropdown value picking for foreign key columns in grid view. + * [ADDED]: Context menu entry to go to row in referenced table by current foreign key cell value. + * [BUGFIX]: #2875 Fixed font misconfiguration after Qt update. + * [BUGFIX]: #2879 Fixed View updating after table modification, when view uses SELECT with table alias same as table name. + * [BUGFIX]: #2885 Fixed tokens parsing, causing random problems, such as incorrect formatting performed by the simple formatter. + * [BUGFIX]: Fixed preventing of setting null or empty value on query results that don't come directly from table. + * [BUGFIX]: Fixed duplicates while copying mupltiple lines from status field. + [3.0.6] * [ADDED]: #2740 Option to configure whether bottom dock area (with status field) should extend to left border, or should it leave space for database list. * [ADDED]: #2819 Introduced "compact layout" as an option (enabled by default) to minimize all margins on the interface. diff --git a/SQLiteStudio3/coreSQLiteStudio/TODO.txt b/SQLiteStudio3/coreSQLiteStudio/TODO.txt index e6f699e..5c0f35c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/TODO.txt +++ b/SQLiteStudio3/coreSQLiteStudio/TODO.txt @@ -1,3 +1,15 @@ +Thread 5 Crashed:: Thread (pooled) +0 libcoreSQLiteStudio.1.0.0.dylib 0x0000000101f24ba7 QHash::value(QString const&) const + 23 +1 libcoreSQLiteStudio.1.0.0.dylib 0x0000000101f24ad4 QHash::operator[](QString const&) const + 36 +2 libcoreSQLiteStudio.1.0.0.dylib 0x0000000101f24936 SqlResultsRow::value(QString const&) const + 54 +3 libcoreSQLiteStudio.1.0.0.dylib 0x0000000101f06c1a SchemaResolver::getAllObjects(QString const&) + 1178 +4 libcoreSQLiteStudio.1.0.0.dylib 0x0000000101f06746 SchemaResolver::getAllObjects() + 70 +5 libguiSQLiteStudio.1.0.0.dylib 0x000000010252f428 SqlEditor::refreshValidObjects()::$_0::operator()() const + 456 (sqleditor.cpp:529) +6 libguiSQLiteStudio.1.0.0.dylib 0x000000010252f1ec QtConcurrent::StoredFunctorCall0::runFunctor() + 28 (qtconcurrentstoredfunctioncall.h:72) +7 libguiSQLiteStudio.1.0.0.dylib 0x0000000102534ca1 QtConcurrent::RunFunctionTask::run() + 81 (qtconcurrentrunbase.h:132) +8 libguiSQLiteStudio.1.0.0.dylib 0x0000000102534dbc non-virtual thunk to QtConcurrent::RunFunctionTask::run() + 28 (qtconcurrentrśunbase.h:141) + + * Outstanding features for 3.1: - migrate updates engine to Qt Install Framework - loadable extensions full support diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp index 3ace551..eba10fa 100644 --- a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.cpp @@ -159,6 +159,19 @@ QList getAllNameWrappers(Dialect dialect) return {NameWrapper::DOUBLE_QUOTE, NameWrapper::BRACKET, NameWrapper::QUOTE}; } +QString wrapValueIfNeeded(const QString& str) +{ + return wrapValueIfNeeded(QVariant::fromValue(str)); +} + +QString wrapValueIfNeeded(const QVariant& value) +{ + if (value.canConvert(QMetaType::LongLong) || value.canConvert(QMetaType::Double)) + return value.toString(); + + return wrapString(value.toString()); +} + QString wrapString(const QString& str) { QString result = str; diff --git a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h index 945b7cc..038c146 100644 --- a/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h +++ b/SQLiteStudio3/coreSQLiteStudio/common/utils_sql.h @@ -56,6 +56,8 @@ API_EXPORT QPair getQuoteCharacter(QString& obj, Dialect dialect, API_EXPORT QList wrapObjNames(const QList& objList, Dialect dialect = Dialect::Sqlite3, NameWrapper favWrapper = NameWrapper::null); API_EXPORT QList wrapObjNamesIfNeeded(const QList& objList, Dialect dialect, NameWrapper favWrapper = NameWrapper::null); API_EXPORT QList getAllNameWrappers(Dialect dialect = Dialect::Sqlite3); +API_EXPORT QString wrapValueIfNeeded(const QString& str); +API_EXPORT QString wrapValueIfNeeded(const QVariant& value); API_EXPORT int qHash(NameWrapper wrapper); API_EXPORT QString getPrefixDb(const QString& origDbName, Dialect dialect); API_EXPORT bool isSystemTable(const QString& name); diff --git a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro index e21ee8b..886678d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro +++ b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro @@ -51,7 +51,8 @@ portable { CONFIG += c++11 QMAKE_CXXFLAGS += -pedantic -TRANSLATIONS += translations/coreSQLiteStudio_zh_CN.ts \ +TRANSLATIONS += translations/coreSQLiteStudio_it.ts \ + translations/coreSQLiteStudio_zh_CN.ts \ translations/coreSQLiteStudio_sk.ts \ translations/coreSQLiteStudio_de.ts \ translations/coreSQLiteStudio_ru.ts \ @@ -455,3 +456,4 @@ RESOURCES += \ + diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp index b790ffa..f8d7fd2 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.cpp @@ -201,6 +201,12 @@ void QueryExecutor::run() void QueryExecutor::execInternal() { + if (forceSimpleMode) + { + executeSimpleMethod(); + return; + } + simpleExecution = false; interrupted = false; @@ -456,7 +462,8 @@ void QueryExecutor::simpleExecutionFinished(SqlQueryPtr results) context->resultsHandler = nullptr; } - notifyWarn(tr("SQLiteStudio was unable to extract metadata from the query. Results won't be editable.")); + if (!forceSimpleMode) + notifyWarn(tr("SQLiteStudio was unable to extract metadata from the query. Results won't be editable.")); emit executionFinished(results); } @@ -551,6 +558,16 @@ bool QueryExecutor::handleRowCountingResults(quint32 asyncId, SqlQueryPtr result return true; } +bool QueryExecutor::getForceSimpleMode() const +{ + return forceSimpleMode; +} + +void QueryExecutor::setForceSimpleMode(bool value) +{ + forceSimpleMode = value; +} + const QStringList& QueryExecutor::getRequiredDbAttaches() const { diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h index 83d0436..95c6a0c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutor.h @@ -1029,6 +1029,9 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable const QStringList& getRequiredDbAttaches() const; + bool getForceSimpleMode() const; + void setForceSimpleMode(bool value); + private: /** * @brief Executes query. @@ -1322,6 +1325,8 @@ class API_EXPORT QueryExecutor : public QObject, public QRunnable */ Db::QueryResultsHandler resultsHandler = nullptr; + bool forceSimpleMode = false; + signals: /** * @brief Emitted on successful query execution. diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp index ea42baf..8cc344c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.cpp @@ -59,16 +59,6 @@ QHash> QueryExecutorAddRowIds::addR return rowIdColsMap; } - bool hasStar = false; - for (SqliteSelect::Core::ResultColumn* resCol : core->resultColumns) - { - if (resCol->star) - { - hasStar = true; - break; - } - } - // Getting all tables we need to get ROWID for SelectResolver resolver(db, select->tokens.detokenize(), context->dbNameToAttach); resolver.resolveMultiCore = false; // multicore subselects result in not editable columns, skip them @@ -79,7 +69,7 @@ QHash> QueryExecutorAddRowIds::addR if (table.flags & (SelectResolver::FROM_COMPOUND_SELECT | SelectResolver::FROM_DISTINCT_SELECT | SelectResolver::FROM_GROUPED_SELECT)) continue; // we don't get ROWID from compound, distinct or aggregated subselects - if (!addResultColumns(core, table, rowIdColsMap, isTopSelect, hasStar)) + if (!addResultColumns(core, table, rowIdColsMap, isTopSelect)) { ok = false; return rowIdColsMap; @@ -156,7 +146,7 @@ QHash QueryExecutorAddRowIds::getNextColNames(const SelectResol } bool QueryExecutorAddRowIds::addResultColumns(SqliteSelect::Core* core, const SelectResolver::Table& table, - QHash>& rowIdColsMap, bool isTopSelect, bool hasStar) + QHash>& rowIdColsMap, bool isTopSelect) { QHash executorToRealColumns; bool aliasOnlyAsSelectColumn = false; diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.h index fa2167f..61bc302 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutoraddrowids.h @@ -31,7 +31,7 @@ class QueryExecutorAddRowIds : public QueryExecutorStep * Finds columns representing ROWID for the \p table and adds them to result columns and to the context. */ bool addResultColumns(SqliteSelect::Core* core, const SelectResolver::Table& table, - QHash >& rowIdColsMap, bool isTopSelect, bool hasStar); + QHash >& rowIdColsMap, bool isTopSelect); /** * @brief Adds the column to result columns list. diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/lempar.c b/SQLiteStudio3/coreSQLiteStudio/parser/lempar.c index 4f9cd5c..2d0e610 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/lempar.c +++ b/SQLiteStudio3/coreSQLiteStudio/parser/lempar.c @@ -717,7 +717,11 @@ static void yy_reduce( { tokens.clear(); const char* fieldName = yyTokenName[yypParser->yystack[i].major]; - if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0)) + + // Adding token being subject of this reduction. It's usually not includes in the inherited tokens, + // although if inheriting from simple statements, like "FAIL" or "ROLLBACK", this tends to be redundant with the inherited tokens. + // That's why we're checking if it's not contained in the inherited tokens and add it only then. + if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0) && !yypParser->yystack[i].tokens->contains(yypParser->yystack[i].minor.yy0)) tokens += yypParser->yystack[i].minor.yy0; tokens += *(yypParser->yystack[i].tokens); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp index ffc1fab..81e242d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp @@ -4354,7 +4354,11 @@ static void yy_reduce( { tokens.clear(); const char* fieldName = yyTokenName[yypParser->yystack[i].major]; - if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0)) + + // Adding token being subject of this reduction. It's usually not includes in the inherited tokens, + // although if inheriting from simple statements, like "FAIL" or "ROLLBACK", this tends to be redundant with the inherited tokens. + // That's why we're checking if it's not contained in the inherited tokens and add it only then. + if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0) && !yypParser->yystack[i].tokens->contains(yypParser->yystack[i].minor.yy0)) tokens += yypParser->yystack[i].minor.yy0; tokens += *(yypParser->yystack[i].tokens); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp index fa8a9d1..9ff6487 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp @@ -4973,7 +4973,11 @@ static void yy_reduce( { tokens.clear(); const char* fieldName = yyTokenName[yypParser->yystack[i].major]; - if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0)) + + // Adding token being subject of this reduction. It's usually not includes in the inherited tokens, + // although if inheriting from simple statements, like "FAIL" or "ROLLBACK", this tends to be redundant with the inherited tokens. + // That's why we're checking if it's not contained in the inherited tokens and add it only then. + if (parserContext->isManagedToken(yypParser->yystack[i].minor.yy0) && !yypParser->yystack[i].tokens->contains(yypParser->yystack[i].minor.yy0)) tokens += yypParser->yystack[i].minor.yy0; tokens += *(yypParser->yystack[i].tokens); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp index d3e05f1..f2102c3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/token.cpp @@ -140,9 +140,9 @@ Range Token::getRange() return Range(start, end); } -bool Token::isWhitespace() const +bool Token::isWhitespace(bool includeComments) const { - return (type == SPACE || type == COMMENT); + return (type == SPACE || (includeComments && type == COMMENT)); } bool Token::isSeparating() const @@ -490,11 +490,11 @@ TokenList TokenList::filter(Token::Type type) const return filtered; } -TokenList TokenList::filterWhiteSpaces() const +TokenList TokenList::filterWhiteSpaces(bool includeComments) const { TokenList filtered; foreach (TokenPtr token, *this) - if (!token->isWhitespace()) + if (!token->isWhitespace(includeComments)) filtered << token; return filtered; diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/token.h b/SQLiteStudio3/coreSQLiteStudio/parser/token.h index 222ce1a..aecc7ec 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/token.h +++ b/SQLiteStudio3/coreSQLiteStudio/parser/token.h @@ -190,7 +190,7 @@ struct API_EXPORT Token * * Note, that from SQL perspective also comments are whitespaces. */ - bool isWhitespace() const; + bool isWhitespace(bool includeComments = true) const; /** * @brief Tests whether this token represents separating value (like an operator, or parenthesis) in SQL understanding. @@ -633,7 +633,7 @@ class API_EXPORT TokenList : public QList * * The condition to test if tokens is a whitespace is a call to Token::isWhitespace(). */ - TokenList filterWhiteSpaces() const; + TokenList filterWhiteSpaces(bool includeComments = true) const; /** * @brief Returns sub-list of tokens from this list. diff --git a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp index 8d62b44..46486e8 100644 --- a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp @@ -39,7 +39,7 @@ DEFINE_SINGLETON(SQLiteStudio) -static const int sqlitestudioVersion = 30006; +static const int sqlitestudioVersion = 30007; SQLiteStudio::SQLiteStudio() { diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp index 97e1fb3..3e23239 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp @@ -2,7 +2,6 @@ #include "common/utils_sql.h" #include "parser/parser.h" #include "schemaresolver.h" -#include "selectresolver.h" #include "parser/ast/sqlitecreateindex.h" #include "parser/ast/sqlitecreatetrigger.h" #include "parser/ast/sqlitecreateview.h" @@ -530,17 +529,32 @@ SqliteQuery* TableModifier::handleTriggerQuery(SqliteQuery* query, const QString SqliteSelect* TableModifier::handleSelect(SqliteSelect* select, const QString& trigTable) { + SelectResolver selectResolver(db, select->detokenize()); + // Table name - TokenList tableTokens = select->getContextTableTokens(false); - foreach (TokenPtr token, tableTokens) + QList selSources = select->getAllTypedStatements(); + TokenList tableTokens; + StrHash resolvedTables; + for (SqliteSelect::Core* core : select->coreSelects) { - if (token->value.compare(originalTable, Qt::CaseInsensitive) == 0) + resolvedTables = tablesAsNameHash(selectResolver.resolveTables(core)); + + tableTokens = core->getContextTableTokens(false); + foreach (TokenPtr token, tableTokens) + { + if (token->value.compare(originalTable, Qt::CaseInsensitive) != 0) + continue; + + // Check if that table name is the same as its alias name, so we use alias name and we don't rename it here, cause it's alias, not table + if (isTableAliasUsedForColumn(token, resolvedTables, selSources)) + continue; + token->value = newName; + } } // Column names TokenList columnTokens = select->getContextColumnTokens(false); - SelectResolver selectResolver(db, select->detokenize()); QList columns = selectResolver.translateToColumns(select, columnTokens); TokenList columnTokensToChange; @@ -577,6 +591,41 @@ SqliteSelect* TableModifier::handleSelect(SqliteSelect* select, const QString& t return new SqliteSelect(*selectPtr.data()); } +StrHash TableModifier::tablesAsNameHash(const QSet& resolvedTables) +{ + StrHash result; + for (const SelectResolver::Table& tab : resolvedTables) + result[tab.table] = tab; + + return result; +} + +bool TableModifier::isTableAliasUsedForColumn(const TokenPtr &token, const StrHash &resolvedTables, const QList &selSources) +{ + // If we don't have the table token on the list of resolved select tables, we don't consider it as aliased + if (!resolvedTables.contains(token->value, Qt::CaseInsensitive)) + { + qWarning() << "Table" << token->value << "in table tokens processed by TableModifier, but not in resolved SELECT tables."; + return false; + } + + SelectResolver::Table table = resolvedTables.value(token->value, Qt::CaseInsensitive); + if (table.alias.isNull()) + return false; + + if (table.alias.compare(token->value), Qt::CaseInsensitive != 0) + return false; + + // If the table token is mentioned in FROM clause, it's not a subject for aliased usage, cuase it defines alias, not uses it. + for (SqliteSelect::Core::SingleSource* src : selSources) + { + if (src->tokens.contains(token)) + return false; + } + + return true; +} + SqliteUpdate* TableModifier::handleTriggerUpdate(SqliteUpdate* update, const QString& trigName, const QString& trigTable) { if (update->table.compare(originalTable, Qt::CaseInsensitive) == 0) diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h index f063693..675202d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h @@ -2,6 +2,7 @@ #define TABLEMODIFIER_H #include "db/db.h" +#include "selectresolver.h" #include "parser/ast/sqlitecreatetable.h" #include "parser/ast/sqliteupdate.h" #include "parser/ast/sqliteinsert.h" @@ -9,6 +10,7 @@ #include "parser/ast/sqlitecreateindex.h" #include "parser/ast/sqlitecreatetrigger.h" #include "parser/ast/sqlitecreateview.h" +#include "common/strhash.h" class API_EXPORT TableModifier { @@ -50,6 +52,8 @@ class API_EXPORT TableModifier SqliteUpdate* handleTriggerUpdate(SqliteUpdate* update, const QString& trigName, const QString& trigTable); SqliteInsert* handleTriggerInsert(SqliteInsert* insert, const QString& trigName, const QString& trigTable); SqliteDelete* handleTriggerDelete(SqliteDelete* del, const QString& trigName, const QString& trigTable); + StrHash tablesAsNameHash(const QSet &resolvedTables); + bool isTableAliasUsedForColumn(const TokenPtr& token, const StrHash& resolvedTables, const QList& selSources); bool handleSubSelects(SqliteStatement* stmt, const QString& trigTable); bool handleExprWithSelect(SqliteExpr* expr, const QString& trigTable); bool handleAllExprWithTrigTable(SqliteStatement* stmt, const QString& contextTable); diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts index 7d61000..51b496d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts @@ -7,12 +7,12 @@ Cannot execute query on closed database. - + Die Abfrage kann nicht auf einer ungeöffneten Datenbank ausgeführt werden. Error attaching database %1: %2 - + Fehler beim Anhängen der Datenbank %1: %2 @@ -20,7 +20,7 @@ Invalid login or password - + Ungültiger Nutzername oder Passwort @@ -29,31 +29,31 @@ The database for executing queries was not defined. chain executor - + Es wurde keine Datenbank zur Ausführung von Abfragen festgelegt. The database for executing queries was not open. chain executor - + Die Datenbank ist zur Ausführung von Abfragen nicht geöffnet worden. Could not start a database transaction. Details: %1 chain executor - + Es kann keine Datenbanktransaktion gestartet werden. Details: %1 Interrupted chain executor - + Abgebrochen Could not commit a database transaction. Details: %1 chain executor - + Die Datenbanktransaktion kann nicht 'committet' werden. Details: %1 @@ -61,82 +61,83 @@ New row reference - + Neue Zeilenreferenz Old row reference - + Alte Zeilenreferenz New table name - + Neuer Tabellenname New index name - + Neuer Indizename New view name - + Neuer Viewname New trigger name - + Neuer Triggername Table or column alias - + Tabellen- oder Spaltenalias transaction name - + Transaktionsname New column name - + Neuer Spaltenname Column data type - + Spaltendatentyp Constraint name - + Abhängigkeitsname Error message - + Fehlermeldung Collation name - + Hier weiß ich nicht wie man das sprechend übersetzen kann. + Kollationsname Any word - + Beliebiges Wort Default database - + Standarddatenbank Temporary objects database - + Datenbank für temporäre Objekte @@ -144,35 +145,35 @@ Could not add database %1: %2 - + Die Datenbank %1 kann nicht hinzugefügt werden: %2 Database %1 could not be updated, because of an error: %2 - + Die Datenbank %1 kann nicht aktualisiert werden. Grund: %2 Database file doesn't exist. - + Die Datenbankdatei existiert nicht. No supporting plugin loaded. - + Es wurde kein passendes plugin geladen. Database could not be initialized. - + Die Datenbank kann nicht initialisiert werden. No suitable database driver plugin found. - + Es wurde kein passender Datenbanktreiber (plugin) gefunden. @@ -181,50 +182,51 @@ Error while creating table in target database: %1 - + Fehler beim Erstellen einer Tabelle in der Zieldatenbank %1 Could not parse table. - + Die Tabelle konnte nicht verarbeitet werden. Database %1 could not be attached to database %2, so the data of table %3 will be copied with SQLiteStudio as a mediator. This method can be slow for huge tables, so please be patient. - + Datenbank %1 konnte nicht mit Datenbank %2 verbunden werden, daher werden die Daten der Tabelle %3 durch SQLiteStudio kopiert. Diese Methode kann bei großen Tabellen sehr lange dauern, bitte haben Sie Geduld. Error while copying data for table %1: %2 - + Fehler beim Kopieren von Daten für Tabelle %1: %2 Error while copying data to table %1: %2 - + Fehler beim Kopieren von Daten in die Tabelle %1: %2 Error while dropping source view %1: %2 Tables, indexes, triggers and views copied to database %3 will remain. - + Fehler beim Entfernen des Quellviews %1: %2 +Tabellen, Indizes, Trigger und Views die in Datenbank %3 kopiert wurden, werden auf der Quelldatenbank verbleiben. Error while creating view in target database: %1 - + Fehler beim Erstellen eines Views in der Zieldatenbank %1 Error while creating index in target database: %1 - + Fehler beim Erstellen eines Indizes in der Zieldatenbank %1 Error while creating trigger in target database: %1 - + Fehler beim Erstellen eines Triggers in der Zieldatenbank %1 @@ -232,17 +234,17 @@ Tables, indexes, triggers and views copied to database %3 will remain. Target file exists, but could not be overwritten. - + Die Zieldatei existiert zwar, konnte aber nicht überschrieben werden. Could not find proper database plugin to create target database. - + Es konnte kein geeignetes Datenbankplugin gefunden werden, um die Zieldatenbank zu erzeugen. Error while converting database: %1 - + Fehler beim Konvertieren der Datenbank: %1 @@ -251,25 +253,25 @@ Tables, indexes, triggers and views copied to database %3 will remain. Database name ddl history header - + Datenbankname Database file ddl history header - + Datenbankdatei Date of execution ddl history header - + Datum der Ausführung Changes ddl history header - + Änderungen @@ -277,42 +279,42 @@ Tables, indexes, triggers and views copied to database %3 will remain. Export plugin %1 doesn't support exporing query results. - + Das Exportplugin %1 unterstützt das Exportieren der Abfrageergebnisse nicht. Export plugin %1 doesn't support exporing tables. - + Das Exportplugin %1 unterstützt das Exportieren von Tabellen nicht. Export plugin %1 doesn't support exporing databases. - + Das Exportplugin %1 unterstützt das Exportieren von Datenbanken nicht. Export format '%1' is not supported. Supported formats are: %2. - + Das Exportformat %1 wird nicht unterstützt. Unterstützte Formate sind: %2. Export to the clipboard was successful. - + Der Export in die Zwischenablage war erfolgreich. Export to the file '%1' was successful. - + Der Export in die Datei %1 war erfolgreich. Export was successful. - + Der Export war erfolgreich. Could not export to file %1. File cannot be open for writting. - + Es kann nicht in die Datei %1 exportiert werden. Die Datei lässt sich nicht für Schreibzugriffe öffnen. @@ -320,33 +322,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. Error while exporting query results: %1 - + Fehler beim Exportieren der Abfrageergebnisse: %1 Error while counting data column width to export from query results: %1 - + Fehler beim Ermitteln der Spaltenbreite für den Export der Abfrageergebnisse: %1 Could not parse %1 in order to export it. It will be excluded from the export output. - + %1 konnte zum Exportieren nicht korrekt verarbeitet werden. Diese Daten werden nicht exportiert. Error while reading data to export from table %1: %2 - + Fehler beim Lesen der zu exportierenden Daten aus der Tabelle %1: %2 Error while counting data to export from table %1: %2 - + Fehler beim Ermitteln der zu exportierenden Daten aus der Tabelle %1: %2 Error while counting data column width to export from table %1: %2 - + Fehler beim Ermitteln der Spaltenbreite für den Export aus Tabelle %1: %2 @@ -354,43 +356,44 @@ Tables, indexes, triggers and views copied to database %3 will remain. Invalid number of arguments to function '%1'. Expected %2, but got %3. - + Falsche Anzahl an Parametern für Funktion '%1'. Erwartet wurden %2, angegeben wurden jedoch %3. No such function registered in SQLiteStudio: %1(%2) - + Diese Funktion ist in SQLiteStudio nicht verfügbar: %1(%2) Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. - + Auch hier ist sicherlich eine Überarbeitung nötig, wenn der Kontext der Meldung bekannt ist. + Die Funktion %1(%2) wurde für die Sprache %3 erstellt, jedoch ist das Plugin, welches diese Sprache unterstützt, derzeit nicht geladen. Invalid regular expression pattern: %1 - + Ungültiges Muster für die regulären Ausdrücke: %1 Could not open file %1 for reading: %2 - + Datei %1 kann nicht für Lesezugriffe geöffnet werden: %2 Could not open file %1 for writting: %2 - + Datei %1 kann nicht für Schreibzugriffe geöffnet werden: %2 Error while writting to file %1: %2 - + Fehler beim Schreiben in Datei %1: %2 Unsupported scripting language: %1 - + Nicht unterstützte Skriptsprache: %1 @@ -398,7 +401,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Could not initialize text codec for exporting. Using default codec: %1 - + Der 'Export Textcodec' konnte nicht initialisiert werden. Es wird der Standardcodec genutzt: %1 @@ -406,7 +409,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Imported data to the table '%1' successfully. - + Die Daten wurden erfolgreich in Tabelle %1 importiert. @@ -414,51 +417,51 @@ Tables, indexes, triggers and views copied to database %3 will remain. No columns provided by the import plugin. - + Dieses Importplugin stellt keine Spalten zur Verfügung. Could not start transaction in order to import a data: %1 - + Es kann keine Transaktion zum Import der Daten gestartet werden: %1 Could not commit transaction for imported data: %1 - + Die Transaktion für die importierten Daten kann nicht 'committet' werden: %1 Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. - + Die Tabelle %1 hat weniger Spalten als die zu importierenden Daten liefern. Überschüssige Spalten werden daher ignoriert. Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. - + Die Tabelle %1 hat mehr Spalten als die zu importierenden Daten liefern. Einige Tabellenspalten werden deshalb leer bleiben. Could not create table to import to: %1 - + Die Tabelle, in die importiert werden soll, kann nicht erstellt werden: %1 Error while importing data: %1 - + Fehler beim Import der Daten: %1 Interrupted. import process status update - + Abgebrochen. Could not import data row number %1. The row was ignored. Problem details: %2 - + Datenzeile %1 konnte nicht importiert werden. Die Zeile wurde ignoriert. Problembeschreibung: %2 @@ -466,34 +469,34 @@ Tables, indexes, triggers and views copied to database %3 will remain. Cannot load plugin %1, because it's in conflict with plugin %2. - + Plugin %1 konnte nicht geladen werden, weil ein Konflikt besteht mit Plugin %2. Cannot load plugin %1, because its dependency was not loaded: %2. - + Plugin %1 konnte nicht geladen werden, da dessen Abhängigkeiten nicht geladen worden sind: %2. Cannot load plugin %1. Error details: %2 - + Plugin %1 konnte nicht geladen. Problembeschreibung: %2 Cannot load plugin %1 (error while initializing plugin). - + Plugin %1 konnte wegen eines Fehlers bei der Initialisierung nicht geladen werden. min: %1 plugin dependency version - + Min: %1 max: %1 plugin dependency version - + Max: %1 @@ -502,7 +505,8 @@ Tables, indexes, triggers and views copied to database %3 will remain. Constant populate constant plugin name - + Hier bin ich mir absolut nicht sicher was genau gemeint ist. + konstanten @@ -510,7 +514,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Constant value: - + Konstanter Wert: @@ -519,7 +523,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Dictionary dictionary populating plugin name - + Wörterbuch @@ -527,42 +531,42 @@ Tables, indexes, triggers and views copied to database %3 will remain. Dictionary file - + Wörterbuchdatei Pick dictionary file - + Wähle Wörterbuchdatei aus Word separator - + Wortseperator Whitespace - + Leerzeichen Line break - + Zeilenumbruch Method of using words - + Methode der Wortverwendung Ordered - + Sortiert Randomly - + Zufällig @@ -570,7 +574,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Table '%1' populated successfully. - + Tabelle %1 wurde erfolgreich gefüllt. @@ -578,7 +582,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Random number - + Zufällige Nummer @@ -586,32 +590,32 @@ Tables, indexes, triggers and views copied to database %3 will remain. Constant prefix - + Konstanter Präfix No prefix - + Kein Präfix Minimum value - + Kleinster Wert Maximum value - + Größter Wert Constant suffix - + Konstanter Suffix No suffix - + Kein Suffix @@ -619,7 +623,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Random text - + Zufälliger Text @@ -627,67 +631,68 @@ Tables, indexes, triggers and views copied to database %3 will remain. Use characters from common sets: - + Benutze Zeichen von den gebräuchlichsten Sets: Minimum length - + Mindestlänge Letters from a to z. - + Buchstaben von a bis z. Alpha - + Alphanumerisch Numbers from 0 to 9. - + Ziffern von 0 bis 9. Numeric - + Numerisch A whitespace, a tab and a new line character. - + Ein Leerzeichen, ein Tab und ein Zeilenumbruchzeichen. Whitespace - + Leerzeichen Includes all above and all others. - + Alle obigen und auch andere. Binary - + Binär Use characters from my custom set: - + Benutze Zeichen von meinem benutzerdefinierten Set: Maximum length - + Maximallänge If you type some character multiple times, it's more likely to be used. - + Auch hier kann man besser übersetzen, wenn man den Kontext kennt. + Wenn Sie einige Buchstaben mehrmals eingeben, dann ist es wahrscheinlicher, dass sie genutzt werden. @@ -695,7 +700,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Script - + Skript @@ -703,22 +708,22 @@ Tables, indexes, triggers and views copied to database %3 will remain. Initialization code (optional) - + Initialisierungscode (optional) Per step code - + Einzelschrittcode Language - + Sprache Help - + Hilfe @@ -726,7 +731,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Sequence - + Sequenz @@ -734,12 +739,12 @@ Tables, indexes, triggers and views copied to database %3 will remain. Start value: - + Startwert: Step: - + Schritt: @@ -747,17 +752,17 @@ Tables, indexes, triggers and views copied to database %3 will remain. Could not start transaction in order to perform table populating. Error details: %1 - + Es kann keine Transaktion zum Füllen der Tabelle gestartet werden. Problembeschreibung: %1 Error while populating table: %1 - + Fehler beim Füllen der Tabelle: %1 Could not commit transaction after table populating. Error details: %1 - + Die Transaktion zum Füllen der Tabelle kann nicht 'committet' werden. Problembeschreibung: %1 @@ -766,18 +771,18 @@ Tables, indexes, triggers and views copied to database %3 will remain. Could not open database: %1 - + Die Datenbank %1 kann nicht geöffnet werden. - + Result set expired or no row available. - + Das Abfrageergebniss ist ungültig oder es ist keine Datenzeile verfügbar. Could not close database: %1 - + Die Datenbank %1 kann nicht geschlossen werden. @@ -788,18 +793,19 @@ Tables, indexes, triggers and views copied to database %3 will remain. SQLite %1 does not support '%2' statement. - + SQLite %1 unterstützt keine '%2' Abfrage. SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. - + SQLite %1 unterstützt keine '%2' Abfrage, aber die normale Tabelle kann stattdessen erzeugt werden, wenn Sie fortfahren. Could not parse statement: %1 Error details: %2 - + Die Abfrage kann nicht verarbeitet werden: %1 +Problembeschreibung: %2 @@ -807,202 +813,204 @@ Error details: %2 SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. - + SQLite %1 unterstützt keine '%2' Klausel. Die %3 Abfrage kann mit dieser Klausel nicht konvertiert werden. SQLite %1 does not support the '%2' clause in the '%3' statement. - + SQLite %1 unterstützt keine '%2' Klausel in der %3 Abfrage. SQLite %1 does not support current date or time clauses in expressions. - + SQLite %1 unterstützt keine current date' oder 'time' Klauseln in Ausdrücken. SQLite %1 does not support '%2' clause in expressions. - + SQLite %1 unterstützt keine '%2' Klausel Ausdrücken. Could not attach database %1: %2 - + Generell muss in den Übersetzungen das 'attached' genauer analysiert werden. + Die Datenbank %1 kann nicht angefügt werden: %2 Incomplete query. - + Unvollständige Abfrage. Parser stack overflow - + Stacküberlauf bei Verarbeitung - - + + Syntax error - + Syntaxfehler Could not open dictionary file %1 for reading. - + Die Wörterbuchdatei %1 kann für den Lesezugriff nicht geöffnet werden. Dictionary file must exist and be readable. - + Die Wörterbuchdatei muss vorhanden sein und Leserechte besitzen. Maximum value cannot be less than minimum value. - + Der Maximalwert kann nicht kleiner sein als der Minimalwert. Maximum length cannot be less than minimum length. - + Die Maximallänge kann nicht kleiner sein als die Minimallänge. Custom character set cannot be empty. - + Ein benutzerdefiniertes Zeichenset darf nicht leer sein. Could not find plugin to support scripting language: %1 - + Das Plugin zur Unterstützung der folgenden Skriptsprache kann nicht gefunden werden: %1 Error while executing populating initial code: %1 - + Fehler beim Ausführen des Initialisierungsprozesses: %1 Error while executing populating code: %1 - + Fehler beim Ausführen des Auffüllprozesses: %1 Select implementation language. - + Wählen Sie die Implementationssprache. Implementation code cannot be empty. - + Der Implementationscode darf nicht leer sein. - + Could not resolve data source for column: %1 - + Die Datenquelle für Spalte %1 kann nicht aufgelöst werden. - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. - + Ich hoffe, dass ich "to initialize" hier richtig mit "erstellt" übersetzt habe. + Die Konfigurationsdatei kann nicht erstellt werden. Alle Änderungen an der Konfiguration sowie die Abfragehistorie sind nach einem Programmneustart verloren. Es wurde versucht die Konfigurationsdatei in folgendem Verzeichnis zu erstellen: %1 General purpose plugin category name - + Allgemeine Verwendung Database support plugin category name - + Datenbankunterstützung Code formatter plugin category name - + Codeformatierer Scripting languages plugin category name - + Skriptsprachen Exporting plugin category name - + Exportieren Importing plugin category name - + Importieren Table populating plugin category name - + Tabellen füllen - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + Tabelle %1 referenziert Tabelle %2, jedoch wird die 'foreign key'-Definition für die neue Tabellendefinition nicht aktualisiert, da es Probleme bei der DDL-Analyse von Tabelle %3 gibt. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + Alle Spalten, die von Index %1 indiziert wurden, sind verloren. Der Index wird nach der Tabellenmodifikation nicht neu erstellt. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Es ist ein Problem bei der korrekten Verarbeitung des Triggers %1 aufgetreten. Er wird möglicherweise nicht vollständig aktualisert werden und sollte geprüft werden. - + Cannot not update trigger %1 according to table %2 modification. - + Die Aktualisierung des Triggers %1, resultierend aus der Änderung der Tabelle %2, kann nicht ausgeführt werden. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + Es ist ein Problem beim Aktualisieren einer %1 Abfrage innerhalb eines %2 Triggers aufgetreten. Eine der %1 Unterabfragen, welche möglicherweise die Tabelle %3 referenziert, kann nicht geändert werden. Eine manuelle Anpassung des Triggers wird nötig sein. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - + Alle Spalten, die durch den Trigger %1 abgedeckt wurden, sind verloren. Der Trigger wird nach der Änderung nicht wiederhergestellt. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. - + Die Aktualisierung des Views %1, resultierend aus der Änderung der Tabelle %2, kann nicht ausgeführt werden. Der View wird daher nicht geändert. Could not parse DDL of the view to be created. Details: %1 - + DDL des zu erzeugenden Views kann nicht verarbeitet werden. Details: %1 Parsed query is not CREATE VIEW. It's: %1 - + Die zu verarbeitende Abfrage ist nicht CREATE VIEW, es ist: %1 SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. - + SQLiteStudio konnte die vom View zurückgegebenen Spalten nicht auflösen, daher kann nicht ermittelt werden, welcher Trigger beim Wiederherstelllungsprozess einen Fehler verusracht haben könnte. @@ -1010,28 +1018,29 @@ The view will remain as it is. Execution interrupted. - + Ausführung abgebrochen. Database is not open. - + Die Datenbank ist nicht geöffnet. Only one query can be executed simultaneously. - + Es kann nur eine Abfrage gleichzeitig ausgeführt werden. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 - + Hier muss ggf. noch das 'data paging' korrekt übersetzt werden. + Beim Ausführen der count(*) Abfrage ist ein Fehler aufgetreten, daher wird das data paging abgeschaltet. Problemdetails der Datenbank: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. - + SQLiteStudio konnte keine Metadaten aus der Abfrage extrahieren. Die Ergebnismenge kann daher nicht editiert werden. @@ -1039,12 +1048,12 @@ The view will remain as it is. No database available in current context, while called QtScript's %1 command. - + Beim Aufruf des QtSkript Kommandos %1 ist im zugehörigen Kontext keine Datenbank verfügbar. Error from %1: %2 - + Fehler von %1: %2 @@ -1053,31 +1062,31 @@ The view will remain as it is. Database sql history header - + Datenbank Execution date sql history header - + Ausführungsdatum Time spent sql history header - + Dauer Rows affected sql history header - + Anzahl Zeilen SQL sql history header - + SQL @@ -1085,99 +1094,101 @@ The view will remain as it is. An error occurred while checking for updates: %1. - + Beim Prüfen auf Updates trat folgender Fehler auf: %1 Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. - + Es konnte nicht auf neue Updates geprüft werden, da der Updateserver in einem ungültigen Nachrichtenformat antwortet. Diese Meldung kann gefahrlos ignoriert werden. An error occurred while reading updates metadata: %1. - + Beim Lesen der Update-Metadaten ist ein Fehler aufgetreten: %1. Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. - + Das Update konnte nicht heruntergeladen werden, da der Updateserver in einem ungültigen Nachrichtenformat antwortet. Sie können es später noch einmal versuchen oder das Update und die Installation manuell ausführen. Weitere Infoamtionen hierzu finden Sie in der <a href="%1">Programmdokumentation</a>. Could not create temporary directory for downloading the update. Updating aborted. - + Das temporäre Verzeichnis zum Herunterladen des Updates konnte nicht erstellt werden. Der Updatevorgang wird abgebrochen. There was no updates to download. Updating aborted. - + Keine neuen Updates vorhanden. Der Updatevorgang wird beendet. Downloading: %1 - + Herunterladen von: %1 Could not determinate file name from update URL: %1. Updating aborted. - + Der Dateiname der Update-URL %1 konnte nicht ermittelt werden. Der Updatevorgang wird abgebrochen. Failed to open file '%1' for writting: %2. Updating aborted. - + Beim Schreiben in die Datei '%1' trat folgender Fehler auf: %2. Der Updatevorgang wird abgebrochen. Installing updates. - + Update wird installiert. Could not copy current application directory into %1 directory. - + Das aktuelle Programmverzeichnis konnte nicht in das Verzeichnis %1 kopiert werden. Could not create directory %1. - + Das Verzeichnis %1 konnte nicht erstellt werden. Could not rename directory %1 to %2. Details: %3 - + Das Verzeichnis %1 konnte nicht in %2 umbenannt werden. +Details: %3 Cannot not rename directory %1 to %2. Details: %3 - + Das Verzeichnis %1 kann nicht in %2 umbenannt werden. +Details: %3 Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 - + Das Verzeichnis %1 konnte nicht nach %2 verschoben werden. Ebenso schlug das Wiederherstellen des originalen Verzeichnissses fehlt, daher befindet sich das SQLiteStudio Verzeichnis nun hier: %3 Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. - + Das Das Verzeichnis %1 konnte nicht nach %2 umbenannt werden.SQLiteStudio wird auf den Ursprungszustand zurückgesetzt. Could not unpack component %1 into %2 directory. - + Die Komponente %1 konnte nicht in das Verzeichnis %2 extrahiert werden. Could not find permissions elevator application to run update as a root. Looked for: %1 - + Die Rechteerweiterung zum Ausführen des Updates als 'root' konnte nicht gefunden werden. Es wurde gesucht nach: %1 Could not execute final updating steps as root: %1 - + Die abschließenden Aktualisierungsschritte konnten nicht als 'root' ausgeführt werden: %1 @@ -1185,99 +1196,100 @@ Details: %3 Could not execute final updating steps as admin: %1 - + Die abschließenden Aktualisierungsschritte konnten nicht als 'admin' ausgeführt werden: %1 Cannot create temporary directory for updater. - + Das temporäre Verzeichnis für den Updater konnte nicht erstellt werden. Cannot create updater script file. - + Die Skriptdatei für den Updater konnte nicht erstellt werden. Updating canceled. - + Updatevorgang abgebrochen. Could not execute final updating steps as administrator. - + Die abschließenden Aktualisierungsschritte konnten nicht als 'administrator' ausgeführt werden. Could not execute final updating steps as administrator. Updater startup timed out. - + Die abschließenden Aktualisierungsschritte konnten nicht als 'administrator' ausgeführt werden. Die Updatevorbereitungen liefen auf Zeitüberschreitung. Could not execute final updating steps as administrator. Updater operation timed out. - + Die abschließenden Aktualisierungsschritte konnten nicht als 'administrator' ausgeführt werden. Der Updatevorgang lief auf Zeitüberschreitung. Could not clean up temporary directory %1. You can delete it manually at any time. - + Das temporäre Verzeichnis %1 konnte nicht aufgeräumt werden. Sie können es später manuell löschen. Could not run new version for continuing update. - + Die neue Version zum Fortführen des Updates kann nicht gestartet werden. Package not in tar.gz format, cannot install: %1 - + Das Paket liegt nicht im tar.gz Format vor. %1 kann nicht installiert werden. Package %1 cannot be installed, because cannot move it to directory: %2 - + Das Paket %1 kann nicht installiert werden, weil es nicht in das Verzeichnis %2 verschoben werden kann. Package %1 cannot be installed, because cannot unpack it: %2 - + Das Paket %1 kann nicht installiert werden, weil es nicht extrahiert werden kann: %2 Package not in zip format, cannot install: %1 - + Das Paket liegt nicht im zip Format vor. %1 kann nicht installiert werden. Package %1 cannot be installed, because cannot unzip it to directory %2: %3 - + Das Paket %1 kann nicht installiert werden, weil es nicht in das Verzeichnis %2: %3 extrahiert werden kann. Package %1 cannot be installed, because cannot unzip it to directory: %2 - + Das Paket %1 kann nicht installiert werden, weil es nicht in das Verzeichnis %2 entzippt werden kann. Could not rename directory %1 to %2. - + Das Verzeichnis %1 konnte nicht in %2 umbenannt werden. Could not delete directory %1. - + Das Verzeichnis %1 konnte nicht gelöscht werden. Error executing update command: %1 Error message: %2 - + Fehler beim Ausführen des Updatekommandos %1. +Fehlerbeschreibung: %2 An error occurred while downloading updates: %1. Updating aborted. - + Beim Herunterladen des Updates %1 ist ein fehelr aufgetreten. Der Updatevorgang wurde abgebrochen. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts index 054d1dc..8131da9 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts @@ -769,7 +769,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -844,8 +844,8 @@ Error details: %2 - - + + Syntax error @@ -900,12 +900,12 @@ Error details: %2 - + Could not resolve data source for column: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. @@ -952,39 +952,39 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. @@ -1024,12 +1024,12 @@ The view will remain as it is. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts index 2931eff..5d6090c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts @@ -770,7 +770,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma Impossible d'ouvrir la base de données: %1 - + Result set expired or no row available. Terminé ou aucune ligne valide. @@ -846,8 +846,8 @@ Détails erreur: %2 Analyse dépassement pile - - + + Syntax error Erreur de syntaxe @@ -902,12 +902,12 @@ Détails erreur: %2 L'application de code ne peut être vide. - + Could not resolve data source for column: %1 Impossible de résoudre la source de données pour la colonnes: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. Impossible d'initialiser le fichier de configuration. Aucune modification et les requêtes seront perdues après redémarrage. Essayez d'initialiser le fichier avec cette localisation: %1. @@ -954,39 +954,39 @@ Détails erreur: %2 Peuplement de la table - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. La table %1 référence la table %2, mais la clé étrangère ne pourra être mise à jour pour la nouvelle table à cause de problèmes lors de l'analyse DDL de la table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Toutes les colonnes indéxées par l'indexe %1 sont faites. L'indexe ne sera pas recréé après la modification de la table. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. Impossible de mettre à jour le déclencheur%1 selon la modification de la table %2. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Toutes les colonnes couvertes par le déclencheur %1 sont faites. Le déclencheur ne sera pas recréé après la modification de la table. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Impossible de mettre à jour les modifications de la vue %1 issue de la table %2 @@ -1031,12 +1031,12 @@ La vue restera telque. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 Une erreur s'est produite à l'exécution de la requête count(*), la recherche des données est arrêtée. Erreur de la base de données:%1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. SQLiteStudio ne peut extraire des métadonnées d'une requête. Les résultats ne peut être affichés. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts new file mode 100644 index 0000000..27d4349 --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_it.ts @@ -0,0 +1,1283 @@ + + + + + AbstractDb + + + + Cannot execute query on closed database. + + + + + Error attaching database %1: %2 + + + + + BugReporter + + + Invalid login or password + + + + + ChainExecutor + + + The database for executing queries was not defined. + chain executor + + + + + The database for executing queries was not open. + chain executor + + + + + Could not start a database transaction. Details: %1 + chain executor + + + + + Interrupted + chain executor + + + + + Could not commit a database transaction. Details: %1 + chain executor + + + + + CompletionHelper + + + New row reference + + + + + Old row reference + + + + + New table name + + + + + New index name + + + + + New view name + + + + + New trigger name + + + + + Table or column alias + + + + + transaction name + + + + + New column name + + + + + Column data type + + + + + Constraint name + + + + + Error message + + + + + Collation name + + + + + Any word + + + + + Default database + + + + + Temporary objects database + + + + + DbManagerImpl + + + Could not add database %1: %2 + + + + + Database %1 could not be updated, because of an error: %2 + + + + + + Database file doesn't exist. + + + + + + + No supporting plugin loaded. + + + + + Database could not be initialized. + + + + + No suitable database driver plugin found. + + + + + DbObjectOrganizer + + + + Error while creating table in target database: %1 + + + + + Could not parse table. + + + + + Database %1 could not be attached to database %2, so the data of table %3 will be copied with SQLiteStudio as a mediator. This method can be slow for huge tables, so please be patient. + + + + + Error while copying data for table %1: %2 + + + + + + + Error while copying data to table %1: %2 + + + + + Error while dropping source view %1: %2 +Tables, indexes, triggers and views copied to database %3 will remain. + + + + + Error while creating view in target database: %1 + + + + + Error while creating index in target database: %1 + + + + + Error while creating trigger in target database: %1 + + + + + DbVersionConverter + + + Target file exists, but could not be overwritten. + + + + + Could not find proper database plugin to create target database. + + + + + Error while converting database: %1 + + + + + DdlHistoryModel + + + Database name + ddl history header + + + + + Database file + ddl history header + + + + + Date of execution + ddl history header + + + + + Changes + ddl history header + + + + + ExportManager + + + Export plugin %1 doesn't support exporing query results. + + + + + Export plugin %1 doesn't support exporing tables. + + + + + Export plugin %1 doesn't support exporing databases. + + + + + Export format '%1' is not supported. Supported formats are: %2. + + + + + Export to the clipboard was successful. + + + + + Export to the file '%1' was successful. + + + + + Export was successful. + + + + + Could not export to file %1. File cannot be open for writting. + + + + + ExportWorker + + + Error while exporting query results: %1 + + + + + Error while counting data column width to export from query results: %1 + + + + + + Could not parse %1 in order to export it. It will be excluded from the export output. + + + + + Error while reading data to export from table %1: %2 + + + + + Error while counting data to export from table %1: %2 + + + + + Error while counting data column width to export from table %1: %2 + + + + + FunctionManagerImpl + + + Invalid number of arguments to function '%1'. Expected %2, but got %3. + + + + + No such function registered in SQLiteStudio: %1(%2) + + + + + Function %1(%2) was registered with language %3, but the plugin supporting that language is not currently loaded. + + + + + Invalid regular expression pattern: %1 + + + + + + Could not open file %1 for reading: %2 + + + + + Could not open file %1 for writting: %2 + + + + + Error while writting to file %1: %2 + + + + + Unsupported scripting language: %1 + + + + + GenericExportPlugin + + + Could not initialize text codec for exporting. Using default codec: %1 + + + + + ImportManager + + + Imported data to the table '%1' successfully. + + + + + ImportWorker + + + No columns provided by the import plugin. + + + + + Could not start transaction in order to import a data: %1 + + + + + Could not commit transaction for imported data: %1 + + + + + Table '%1' has less columns than there are columns in the data to be imported. Excessive data columns will be ignored. + + + + + Table '%1' has more columns than there are columns in the data to be imported. Some columns in the table will be left empty. + + + + + Could not create table to import to: %1 + + + + + + + Error while importing data: %1 + + + + + + Interrupted. + import process status update + + + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + + + + PluginManagerImpl + + + Cannot load plugin %1, because it's in conflict with plugin %2. + + + + + Cannot load plugin %1, because its dependency was not loaded: %2. + + + + + Cannot load plugin %1. Error details: %2 + + + + + Cannot load plugin %1 (error while initializing plugin). + + + + + min: %1 + plugin dependency version + + + + + max: %1 + plugin dependency version + + + + + PopulateConstant + + + Constant + populate constant plugin name + + + + + PopulateConstantConfig + + + Constant value: + + + + + PopulateDictionary + + + Dictionary + dictionary populating plugin name + + + + + PopulateDictionaryConfig + + + Dictionary file + + + + + Pick dictionary file + + + + + Word separator + + + + + Whitespace + + + + + Line break + + + + + Method of using words + + + + + Ordered + + + + + Randomly + + + + + PopulateManager + + + Table '%1' populated successfully. + + + + + PopulateRandom + + + Random number + + + + + PopulateRandomConfig + + + Constant prefix + + + + + No prefix + + + + + Minimum value + + + + + Maximum value + + + + + Constant suffix + + + + + No suffix + + + + + PopulateRandomText + + + Random text + + + + + PopulateRandomTextConfig + + + Use characters from common sets: + + + + + Minimum length + + + + + Letters from a to z. + + + + + Alpha + + + + + Numbers from 0 to 9. + + + + + Numeric + + + + + A whitespace, a tab and a new line character. + + + + + Whitespace + + + + + Includes all above and all others. + + + + + Binary + + + + + Use characters from my custom set: + + + + + Maximum length + + + + + If you type some character multiple times, it's more likely to be used. + + + + + PopulateScript + + + Script + + + + + PopulateScriptConfig + + + Initialization code (optional) + + + + + Per step code + + + + + Language + + + + + Help + + + + + PopulateSequence + + + Sequence + + + + + PopulateSequenceConfig + + + Start value: + + + + + Step: + + + + + PopulateWorker + + + Could not start transaction in order to perform table populating. Error details: %1 + + + + + Error while populating table: %1 + + + + + Could not commit transaction after table populating. Error details: %1 + + + + + QObject + + + + Could not open database: %1 + + + + + + Result set expired or no row available. + + + + + Could not close database: %1 + + + + + + + + + + + SQLite %1 does not support '%2' statement. + + + + + SQLite %1 does not support '%2' statement, but the regular table can be created instead if you proceed. + + + + + Could not parse statement: %1 +Error details: %2 + + + + + + + + SQLite %1 does not support the '%2' clause. Cannot convert '%3' statement with that clause. + + + + + SQLite %1 does not support the '%2' clause in the '%3' statement. + + + + + SQLite %1 does not support current date or time clauses in expressions. + + + + + + + SQLite %1 does not support '%2' clause in expressions. + + + + + Could not attach database %1: %2 + + + + + + Incomplete query. + + + + + + Parser stack overflow + + + + + + Syntax error + + + + + Could not open dictionary file %1 for reading. + + + + + Dictionary file must exist and be readable. + + + + + Maximum value cannot be less than minimum value. + + + + + Maximum length cannot be less than minimum length. + + + + + Custom character set cannot be empty. + + + + + Could not find plugin to support scripting language: %1 + + + + + Error while executing populating initial code: %1 + + + + + Error while executing populating code: %1 + + + + + Select implementation language. + + + + + Implementation code cannot be empty. + + + + + Could not resolve data source for column: %1 + + + + + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. + + + + + General purpose + plugin category name + + + + + Database support + plugin category name + + + + + Code formatter + plugin category name + + + + + Scripting languages + plugin category name + + + + + Exporting + plugin category name + + + + + Importing + plugin category name + + + + + Table populating + plugin category name + + + + + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. + + + + + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. + + + + + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. + + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + + Cannot not update trigger %1 according to table %2 modification. + + + + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. + + + + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + + + + Could not parse DDL of the view to be created. Details: %1 + + + + + Parsed query is not CREATE VIEW. It's: %1 + + + + + SQLiteStudio was unable to resolve columns returned by the new view, therefore it won't be able to tell which triggers might fail during the recreation process. + + + + + QueryExecutor + + + Execution interrupted. + + + + + Database is not open. + + + + + Only one query can be executed simultaneously. + + + + + + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 + + + + + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. + + + + + ScriptingQtDbProxy + + + No database available in current context, while called QtScript's %1 command. + + + + + Error from %1: %2 + + + + + SqlHistoryModel + + + Database + sql history header + + + + + Execution date + sql history header + + + + + Time spent + sql history header + + + + + Rows affected + sql history header + + + + + SQL + sql history header + + + + + UpdateManager + + + An error occurred while checking for updates: %1. + + + + + Could not check available updates, because server responded with invalid message format. It is safe to ignore this warning. + + + + + An error occurred while reading updates metadata: %1. + + + + + Could not download updates, because server responded with invalid message format. You can try again later or download and install updates manually. See <a href="%1">User Manual</a> for details. + + + + + Could not create temporary directory for downloading the update. Updating aborted. + + + + + There was no updates to download. Updating aborted. + + + + + Downloading: %1 + + + + + Could not determinate file name from update URL: %1. Updating aborted. + + + + + Failed to open file '%1' for writting: %2. Updating aborted. + + + + + Installing updates. + + + + + Could not copy current application directory into %1 directory. + + + + + Could not create directory %1. + + + + + Could not rename directory %1 to %2. +Details: %3 + + + + + Cannot not rename directory %1 to %2. +Details: %3 + + + + + Could not move directory %1 to %2 and also failed to restore original directory, so the original SQLiteStudio directory is now located at: %3 + + + + + Could not rename directory %1 to %2. Rolled back to the original SQLiteStudio version. + + + + + Could not unpack component %1 into %2 directory. + + + + + Could not find permissions elevator application to run update as a root. Looked for: %1 + + + + + Could not execute final updating steps as root: %1 + + + + + + + + Could not execute final updating steps as admin: %1 + + + + + Cannot create temporary directory for updater. + + + + + Cannot create updater script file. + + + + + Updating canceled. + + + + + Could not execute final updating steps as administrator. + + + + + Could not execute final updating steps as administrator. Updater startup timed out. + + + + + Could not execute final updating steps as administrator. Updater operation timed out. + + + + + Could not clean up temporary directory %1. You can delete it manually at any time. + + + + + Could not run new version for continuing update. + + + + + Package not in tar.gz format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot move it to directory: %2 + + + + + Package %1 cannot be installed, because cannot unpack it: %2 + + + + + Package not in zip format, cannot install: %1 + + + + + Package %1 cannot be installed, because cannot unzip it to directory %2: %3 + + + + + Package %1 cannot be installed, because cannot unzip it to directory: %2 + + + + + + Could not rename directory %1 to %2. + + + + + Could not delete directory %1. + + + + + Error executing update command: %1 +Error message: %2 + + + + + An error occurred while downloading updates: %1. Updating aborted. + + + + diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts index 85cfca2..a89ea4d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -748,7 +748,7 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na Step: - Wartość końcowa: + Krok: diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts index 64f66a5..bb040e6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts @@ -769,7 +769,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -844,8 +844,8 @@ Error details: %2 - - + + Syntax error @@ -900,12 +900,12 @@ Error details: %2 - + Could not resolve data source for column: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. @@ -952,39 +952,39 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. @@ -1024,12 +1024,12 @@ The view will remain as it is. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts index 8bbab69..83ba986 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -771,7 +771,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Невозможно открыть базу данных: %1 - + Result set expired or no row available. Результирующая выборка устарела или ни одна строка не доступна. @@ -846,8 +846,8 @@ Error details: %2 Переполнение стека анализатора - - + + Syntax error Синтаксическая ошибка @@ -902,12 +902,12 @@ Error details: %2 Заполняющий код не может быть пустым. - + Could not resolve data source for column: %1 Невозможно определить источник данных для столбца: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. Невозможно инициализировать файл конфигурации. Любые изменения конфигурации и история запросов будут утеряны после перезапуска приложения. Попытки инициализации файла предпринимались в следующих местах: %1. @@ -954,39 +954,39 @@ Error details: %2 Заполнение таблиц - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. Таблица %1 ссылается на таблицу %2, но описание внешнего ключа не будет обновлено для описания новой таблицы из-за проблем с анализом DDL таблицы %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Все столбцы, проиндексированные индексом %1, удалены. Индекс не будет воссоздан после модификации таблицы. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. Возникла проблема при обработке триггера %1. Впоследствии он не будет полностью обновлён и потребует вашего внимания. - + Cannot not update trigger %1 according to table %2 modification. Невозможно обновить триггер %1 в соответствии с модификацией таблицы %2. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. Возникла проблема при обновлении конструкции %1 внутри триггера %2. Одна из вложенных конструкций %1, которая возможно ссылается на таблицу %3, не может быть корректно модифицирована. Возможно необходима ручная правка триггера. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Все столбцы, затронутые в триггере %1, удалены. Триггер не будет воссоздан после модификации таблицы. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Невозможно обновить представление %1 в соответствии с модификациями таблицы %2. @@ -1031,12 +1031,12 @@ The view will remain as it is. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 Возникла ошибка при выполнении запроса count(*), поэтому разбивка данных по страницам отключена. Детали ошибки из базы данных: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. SQLiteStudio не удалось извлечь метаданные из запроса. Результаты нельзя будет редактировать. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts index e953940..1c29a80 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -149,7 +149,7 @@ Database %1 could not be updated, because of an error: %2 - + Databáza %1 nemôže byť aktualizovaná kvôli chybe: %2 @@ -446,7 +446,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Error while importing data: %1 - + Vyskytla sa chyba počas importu dát: %1 @@ -752,7 +752,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Error while populating table: %1 - + Vyskytla sa chyba počas napĺňania tabuľky: %1 @@ -769,7 +769,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -844,8 +844,8 @@ Error details: %2 - - + + Syntax error Chyba syntaxe @@ -900,12 +900,12 @@ Error details: %2 - + Could not resolve data source for column: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. @@ -952,39 +952,39 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. @@ -1024,12 +1024,12 @@ The view will remain as it is. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 - + Vyskytla sa chyba počas vykonávania dotazu count(*), dôsledkom čoho bolo zablokované stránkovanie. Detail chyby: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. @@ -1086,7 +1086,7 @@ The view will remain as it is. An error occurred while checking for updates: %1. - + Vyskytla sa chyba počas kontroly aktualizácii: %1. @@ -1116,7 +1116,7 @@ The view will remain as it is. Downloading: %1 - + Sťahujem: %1 @@ -1131,7 +1131,7 @@ The view will remain as it is. Installing updates. - + Inštalujem aktualizácie. @@ -1278,7 +1278,7 @@ Error message: %2 An error occurred while downloading updates: %1. Updating aborted. - + Vyskytla sa chyba počas sťahovani aktualizácií:%1. Aktualizácia zrušená. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts index 32cf3b8..448558d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts @@ -20,7 +20,7 @@ Invalid login or password - + 用户名或密码错误 @@ -769,7 +769,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -844,8 +844,8 @@ Error details: %2 - - + + Syntax error @@ -900,12 +900,12 @@ Error details: %2 - + Could not resolve data source for column: %1 - + Could not initialize configuration file. Any configuration changes and queries history will be lost after application restart. Tried to initialize the file at following localizations: %1. @@ -952,39 +952,39 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - - + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. @@ -1024,12 +1024,12 @@ The view will remain as it is. - + An error occured while executing the count(*) query, thus data paging will be disabled. Error details from the database: %1 - + SQLiteStudio was unable to extract metadata from the query. Results won't be editable. diff --git a/SQLiteStudio3/create_source_dist.sh b/SQLiteStudio3/create_source_dist.sh index 646e493..7c56e94 100755 --- a/SQLiteStudio3/create_source_dist.sh +++ b/SQLiteStudio3/create_source_dist.sh @@ -1,11 +1,16 @@ #!/bin/sh +path=trunk +if [ "$1" != "" ]; then + path=branches/$1 +fi + OLDDIR=`pwd` TEMP=`mktemp -d` cd $TEMP -svn co svn://sqlitestudio.pl/sqlitestudio3/trunk sqlitestudio +svn co svn://sqlitestudio.pl/sqlitestudio3/$path sqlitestudio cd sqlitestudio rm -rf .svn diff --git a/SQLiteStudio3/create_win32_portable.bat b/SQLiteStudio3/create_win32_portable.bat index c688dc0..3dfa147 100644 --- a/SQLiteStudio3/create_win32_portable.bat +++ b/SQLiteStudio3/create_win32_portable.bat @@ -1,7 +1,7 @@ @echo off set QT_DIR=c:\Qt\5.4\mingw491_32\bin -set ZIP="c:\Program Files (x86)\7-Zip\7z.exe" +set ZIP="c:\Program Files\7-Zip\7z.exe" set QMAKE=%QT_DIR%\qmake.exe set OLDDIR=%CD% diff --git a/SQLiteStudio3/guiSQLiteStudio/common/tablewidget.cpp b/SQLiteStudio3/guiSQLiteStudio/common/tablewidget.cpp index c9e1446..847f4c5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/tablewidget.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/common/tablewidget.cpp @@ -29,6 +29,7 @@ void TableWidget::copy() if (!item(i, 0)->isSelected()) continue; + cols.clear(); for (int c = 1; c <= 2; c++) { if (cellWidget(i, c)) diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp index 6741d08..920ddda 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp @@ -3,11 +3,15 @@ #include "sqlqueryitem.h" #include "common/unused.h" #include "services/notifymanager.h" +#include "sqlqueryview.h" #include "uiconfig.h" +#include "common/utils_sql.h" +#include #include #include #include #include +#include SqlQueryItemDelegate::SqlQueryItemDelegate(QObject *parent) : QStyledItemDelegate(parent) @@ -51,6 +55,9 @@ QWidget* SqlQueryItemDelegate::createEditor(QWidget* parent, const QStyleOptionV if (item->isLimitedValue()) item->loadFullData(); + if (!item->getColumn()->getFkConstraints().isEmpty()) + return getFkEditor(item, parent); + return getEditor(item->getValue().userType(), parent); } @@ -64,6 +71,55 @@ QString SqlQueryItemDelegate::displayText(const QVariant& value, const QLocale& return QStyledItemDelegate::displayText(value, locale); } +void SqlQueryItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const +{ + QComboBox* cb = dynamic_cast(editor); + if (!cb) { + QStyledItemDelegate::setEditorData(editor, index); + return; + } + + setEditorDataForFk(cb, index); +} + +void SqlQueryItemDelegate::setEditorDataForFk(QComboBox* cb, const QModelIndex& index) const +{ + const SqlQueryModel* queryModel = dynamic_cast(index.model()); + SqlQueryItem* item = queryModel->itemFromIndex(index); + QVariant modelData = item->getValue(); + int idx = cb->findData(modelData, Qt::UserRole); + if (idx == -1 ) + { + cb->addItem(modelData.toString(), modelData); + idx = cb->count() - 1; + + QTableView* view = dynamic_cast(cb->view()); + view->resizeColumnsToContents(); + view->setMinimumWidth(view->horizontalHeader()->length()); + } + cb->setCurrentIndex(idx); +} + +void SqlQueryItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const +{ + QComboBox* cb = dynamic_cast(editor); + if (!cb) { + QStyledItemDelegate::setModelData(editor, model, index); + return; + } + + setModelDataForFk(cb, model, index); +} + +void SqlQueryItemDelegate::setModelDataForFk(QComboBox* cb, QAbstractItemModel* model, const QModelIndex& index) const +{ + QVariant comboData = cb->currentData(); + if (cb->currentText() != cb->itemText(cb->currentIndex())) + comboData = cb->currentText(); + + model->setData(index, comboData); +} + SqlQueryItem* SqlQueryItemDelegate::getItem(const QModelIndex &index) const { const SqlQueryModel* queryModel = dynamic_cast(index.model()); @@ -78,3 +134,120 @@ QWidget* SqlQueryItemDelegate::getEditor(int type, QWidget* parent) const return editor; } + +QString SqlQueryItemDelegate::getSqlForFkEditor(SqlQueryItem* item) const +{ + QString sql = QStringLiteral("SELECT %1 FROM %2%3"); + QStringList selCols; + QStringList fkTables; + QStringList fkCols; + Db* db = item->getModel()->getDb(); + Dialect dialect = db->getDialect(); + + QList fkList = item->getColumn()->getFkConstraints(); + int i = 0; + QString src; + QString col; + for (SqlQueryModelColumn::ConstraintFk* fk : fkList) + { + col = wrapObjIfNeeded(fk->foreignColumn, dialect); + src = wrapObjIfNeeded(fk->foreignTable, dialect); + if (i == 0) + { + selCols << QString("%1.%2 AS %3").arg(src, col, + wrapObjIfNeeded(item->getColumn()->column, dialect)); + } + + selCols << src + ".*"; + fkCols << col; + fkTables << src; + + i++; + } + + QStringList conditions; + QString firstSrc = wrapObjIfNeeded(fkTables.first(), dialect); + QString firstCol = wrapObjIfNeeded(fkCols.first(), dialect); + for (i = 1; i < fkTables.size(); i++) + { + src = wrapObjIfNeeded(fkTables[i], dialect); + col = wrapObjIfNeeded(fkCols[i], dialect); + conditions << QString("%1.%2 = %3.%4").arg(firstSrc, firstCol, src, col); + } + + QString conditionsStr; + if (!conditions.isEmpty()) { + conditionsStr = " WHERE " + conditions.join(", "); + } + + return sql.arg(selCols.join(", "), fkTables.join(", "), conditionsStr); +} + +void SqlQueryItemDelegate::copyToModel(const SqlQueryPtr& results, QStandardItemModel* model) const +{ + QList rows = results->getAll(); + int colCount = results->columnCount(); + int rowCount = rows.size() + 1; + + model->setColumnCount(colCount); + model->setRowCount(rowCount); + int colIdx = 0; + int rowIdx = 0; + for (const QString& colName : results->getColumnNames()) + { + model->setHeaderData(colIdx, Qt::Horizontal, colName); + + QStandardItem *item = new QStandardItem(); + QFont font = item->font(); + font.setItalic(true); + item->setFont(font); + item->setForeground(QBrush(CFG_UI.Colors.DataNullFg.get())); + item->setData(QVariant(QVariant::String), Qt::EditRole); + item->setData(QVariant(QVariant::String), Qt::UserRole); + model->setItem(0, colIdx, item); + colIdx++; + } + rowIdx++; + + for (const SqlResultsRowPtr& row : rows) + { + colIdx = 0; + for (const QVariant& val : row->valueList()) + { + QStandardItem *item = new QStandardItem(); + item->setText(val.toString()); + item->setData(val, Qt::UserRole); + model->setItem(rowIdx, colIdx, item); + colIdx++; + } + rowIdx++; + } +} + +QWidget* SqlQueryItemDelegate::getFkEditor(SqlQueryItem* item, QWidget* parent) const +{ + QString sql = getSqlForFkEditor(item); + + QComboBox *cb = new QComboBox(parent); + cb->setEditable(true); + QTableView* queryView = new QTableView(); + QStandardItemModel* model = new QStandardItemModel(queryView); + + Db* db = item->getModel()->getDb(); + SqlQueryPtr results = db->exec(sql); + copyToModel(results, model); + + cb->setModel(model); + cb->setView(queryView); + cb->setModelColumn(0); + + queryView->verticalHeader()->setVisible(false); + queryView->horizontalHeader()->setVisible(true); + queryView->setSelectionMode(QAbstractItemView::SingleSelection); + queryView->setSelectionBehavior(QAbstractItemView::SelectRows); + queryView->resizeColumnsToContents(); + queryView->resizeRowsToContents(); + queryView->setMinimumWidth(queryView->horizontalHeader()->length()); + + return cb; +} diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.h index 8b894ed..d79ebaf 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.h @@ -2,9 +2,12 @@ #define SQLQUERYITEMDELEGATE_H #include "guiSQLiteStudio_global.h" +#include "db/sqlquery.h" #include class SqlQueryItem; +class QComboBox; +class QStandardItemModel; class GUI_API_EXPORT SqlQueryItemDelegate : public QStyledItemDelegate { @@ -15,10 +18,17 @@ class GUI_API_EXPORT SqlQueryItemDelegate : public QStyledItemDelegate void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; QString displayText(const QVariant & value, const QLocale & locale) const; + void setEditorData(QWidget * editor, const QModelIndex & index) const; + void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const; private: SqlQueryItem* getItem(const QModelIndex &index) const; QWidget* getEditor(int type, QWidget* parent) const; + QWidget* getFkEditor(SqlQueryItem* item, QWidget* parent) const; + void setEditorDataForFk(QComboBox* cb, const QModelIndex& index) const; + void setModelDataForFk(QComboBox* editor, QAbstractItemModel* model, const QModelIndex& index) const; + QString getSqlForFkEditor(SqlQueryItem* item) const; + void copyToModel(const SqlQueryPtr& results, QStandardItemModel* model) const; }; #endif // SQLQUERYITEMDELEGATE_H diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp index bb3a711..6717c14 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp @@ -68,6 +68,7 @@ void SqlQueryModel::executeQuery() queryExecutor->setSkipRowCounting(false); queryExecutor->setSortOrder(sortOrder); queryExecutor->setPage(0); + queryExecutor->setForceSimpleMode(simpleExecutionMode); reloading = false; executeQueryInternal(); @@ -1439,6 +1440,16 @@ int SqlQueryModel::getInsertRowIndex() return row; } +bool SqlQueryModel::getSimpleExecutionMode() const +{ + return simpleExecutionMode; +} + +void SqlQueryModel::setSimpleExecutionMode(bool value) +{ + simpleExecutionMode = value; +} + void SqlQueryModel::addNewRow() { addNewRowInternal(getInsertRowIndex()); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h index a4e7898..f55185a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h @@ -122,6 +122,9 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel static QList> groupItemsByRows(const QList& items); static QHash > groupItemsByTable(const QList& items); + bool getSimpleExecutionMode() const; + void setSimpleExecutionMode(bool value); + protected: class CommitUpdateQueryBuilder : public RowIdConditionBuilder { @@ -263,6 +266,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QString query; bool explain = false; + bool simpleExecutionMode = false; /** * @brief reloadAvailable diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp index 23a4991..e610431 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp @@ -12,6 +12,9 @@ #include "uiconfig.h" #include "dialogs/sortdialog.h" #include "services/notifymanager.h" +#include "windows/editorwindow.h" +#include "mainwindow.h" +#include "common/utils_sql.h" #include #include #include @@ -47,6 +50,7 @@ void SqlQueryView::init() setContextMenuPolicy(Qt::CustomContextMenu); contextMenu = new QMenu(this); + referencedTablesMenu = new QMenu(tr("Go to referenced row in..."), contextMenu); connect(this, &QWidget::customContextMenuRequested, this, &SqlQueryView::customContextMenuRequested); connect(CFG_UI.Fonts.DataView, SIGNAL(changed(QVariant)), this, SLOT(updateFont())); @@ -137,6 +141,9 @@ void SqlQueryView::setupActionsForMenu(SqlQueryItem* currentItem, const QListaddSeparator(); } + if (selectedItems.size() == 1 && selectedItems.first() == currentItem) + addFkActionsToContextMenu(currentItem); + if (selCount > 0) { contextMenu->addAction(actionMap[COPY]); @@ -197,7 +204,8 @@ SqlQueryModel* SqlQueryView::getModel() void SqlQueryView::setModel(QAbstractItemModel* model) { QTableView::setModel(model); - connect(widgetCover, SIGNAL(cancelClicked()), getModel(), SLOT(interrupt())); + SqlQueryModel* m = getModel(); + connect(widgetCover, SIGNAL(cancelClicked()), m, SLOT(interrupt())); connect(getModel(), &SqlQueryModel::commitStatusChanged, this, &SqlQueryView::updateCommitRollbackActions); connect(getModel(), &SqlQueryModel::sortingUpdated, this, &SqlQueryView::sortingUpdated); } @@ -301,6 +309,59 @@ void SqlQueryView::paste(const QList >& data) } } +void SqlQueryView::addFkActionsToContextMenu(SqlQueryItem* currentItem) +{ + QList fkList = currentItem->getColumn()->getFkConstraints(); + if (fkList.isEmpty()) + return; + + QAction* act; + if (fkList.size() == 1) + { + SqlQueryModelColumn::ConstraintFk* fk = fkList.first(); + act = contextMenu->addAction(tr("Go to referenced row in table '%1'").arg(fk->foreignTable)); + connect(act, &QAction::triggered, [this, fk, currentItem](bool) { + goToReferencedRow(fk->foreignTable, fk->foreignColumn, currentItem->getValue()); + }); + contextMenu->addSeparator(); + return; + } + + referencedTablesMenu->clear(); + contextMenu->addMenu(referencedTablesMenu); + for (SqlQueryModelColumn::ConstraintFk* fk : fkList) + { + act = referencedTablesMenu->addAction(tr("table '%1'").arg(fk->foreignTable)); + connect(act, &QAction::triggered, [this, fk, currentItem](bool) { + goToReferencedRow(fk->foreignTable, fk->foreignColumn, currentItem->getValue()); + }); + } + contextMenu->addSeparator(); +} + +void SqlQueryView::goToReferencedRow(const QString& table, const QString& column, const QVariant& value) +{ + Db* db = getModel()->getDb(); + if (!db || !db->isValid()) + return; + + EditorWindow* win = MAINWINDOW->openSqlEditor(); + if (!win->setCurrentDb(db)) + { + qCritical() << "Created EditorWindow had not got requested database:" << db->getName(); + win->close(); + return; + } + + static QString sql = QStringLiteral("SELECT * FROM %1 WHERE %2 = %3"); + + QString valueStr = wrapValueIfNeeded(value.toString()); + + win->getMdiWindow()->rename(tr("Referenced row (%1)").arg(table)); + win->setContents(sql.arg(table, column, valueStr)); + win->execute(); +} + void SqlQueryView::updateCommitRollbackActions(bool enabled) { actionMap[COMMIT]->setEnabled(enabled); @@ -468,14 +529,22 @@ void SqlQueryView::pasteAs() void SqlQueryView::setNull() { - foreach (SqlQueryItem* selItem, getSelectedItems()) + for (SqlQueryItem* selItem : getSelectedItems()) { + if (selItem->getColumn()->editionForbiddenReason.size() > 0) + continue; + selItem->setValue(QVariant(QString::null), false, false); + } } void SqlQueryView::erase() { - foreach (SqlQueryItem* selItem, getSelectedItems()) + for (SqlQueryItem* selItem : getSelectedItems()) { + if (selItem->getColumn()->editionForbiddenReason.size() > 0) + continue; + selItem->setValue("", false, false); + } } void SqlQueryView::commit() diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h index f409559..a1c84bb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h @@ -81,12 +81,15 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer void setupHeaderMenu(); bool editInEditorIfNecessary(SqlQueryItem* item); void paste(const QList>& data); + void addFkActionsToContextMenu(SqlQueryItem* currentItem); + void goToReferencedRow(const QString& table, const QString& column, const QVariant& value); constexpr static const char* mimeDataId = "application/x-sqlitestudio-data-view-data"; SqlQueryItemDelegate* itemDelegate = nullptr; QMenu* contextMenu = nullptr; QMenu* headerContextMenu = nullptr; + QMenu* referencedTablesMenu = nullptr; WidgetCover* widgetCover = nullptr; QPushButton* cancelButton = nullptr; QProgressBar* busyBar = nullptr; diff --git a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro index 3010dca..ff07990 100644 --- a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro +++ b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro @@ -31,7 +31,8 @@ QMAKE_CXXFLAGS += -pedantic DEFINES += GUISQLITESTUDIO_LIBRARY -TRANSLATIONS += translations/guiSQLiteStudio_zh_CN.ts \ +TRANSLATIONS += translations/guiSQLiteStudio_it.ts \ + translations/guiSQLiteStudio_zh_CN.ts \ translations/guiSQLiteStudio_sk.ts \ translations/guiSQLiteStudio_de.ts \ translations/guiSQLiteStudio_ru.ts \ @@ -405,3 +406,4 @@ DISTFILES += \ + diff --git a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp index 4691dda..fb5c7b5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp @@ -156,6 +156,8 @@ void MainWindow::init() #endif connect(CFG_CORE.General.Language, SIGNAL(changed(QVariant)), this, SLOT(notifyAboutLanguageChange())); + + fixFonts(); } void MainWindow::cleanUp() @@ -843,6 +845,17 @@ BugReportHistoryWindow* MainWindow::openReportHistory() return openMdiWindow(); } +void MainWindow::fixFonts() +{ + CfgTypedEntry* typed = nullptr; + for (CfgEntry* cfg : CFG_UI.Fonts.getEntries()) + { + typed = dynamic_cast*>(cfg); + if (typed->get().pointSize() == 0) + cfg->set(cfg->getDefultValue()); + } +} + bool MainWindow::confirmQuit(const QList& instances) { QuitConfirmDialog dialog(MAINWINDOW); diff --git a/SQLiteStudio3/guiSQLiteStudio/mainwindow.h b/SQLiteStudio3/guiSQLiteStudio/mainwindow.h index 46c729b..10d7a9d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mainwindow.h +++ b/SQLiteStudio3/guiSQLiteStudio/mainwindow.h @@ -140,6 +140,7 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer FunctionsEditor* openFunctionEditor(); CollationsEditor* openCollationEditor(); BugReportHistoryWindow* openReportHistory(); + void fixFonts(); template T* openMdiWindow(); diff --git a/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp b/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp index 076894a..4b0628b 100644 --- a/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp @@ -40,6 +40,9 @@ SqlEditor::SqlEditor(QWidget *parent) : SqlEditor::~SqlEditor() { + if (objectsInNamedDbFuture.isRunning()) + objectsInNamedDbFuture.waitForFinished(); + if (queryParser) { delete queryParser; @@ -515,7 +518,7 @@ void SqlEditor::refreshValidObjects() if (!db || !db->isValid()) return; - QtConcurrent::run([this]() + objectsInNamedDbFuture = QtConcurrent::run([this]() { QMutexLocker lock(&objectsInNamedDbMutex); objectsInNamedDb.clear(); @@ -526,7 +529,7 @@ void SqlEditor::refreshValidObjects() QStringList objects; foreach (const QString& dbName, databases) { - objects = resolver.getAllObjects(); + objects = resolver.getAllObjects(dbName); objectsInNamedDb[dbName] << objects; } }); diff --git a/SQLiteStudio3/guiSQLiteStudio/sqleditor.h b/SQLiteStudio3/guiSQLiteStudio/sqleditor.h index f465dcf..28fbb39 100644 --- a/SQLiteStudio3/guiSQLiteStudio/sqleditor.h +++ b/SQLiteStudio3/guiSQLiteStudio/sqleditor.h @@ -10,6 +10,7 @@ #include #include #include +#include class CompleterWindow; class QTimer; @@ -234,6 +235,7 @@ class GUI_API_EXPORT SqlEditor : public QPlainTextEdit, public ExtActionContaine bool virtualSqlCompleteSemicolon = false; QString createTriggerTable; QString loadedFile; + QFuture objectsInNamedDbFuture; static const int autoCompleterDelay = 300; static const int queryParserDelay = 500; diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts index 01b2d5f..f3822d6 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts @@ -1,92 +1,94 @@ - + AboutDialog About SQLiteStudio and licenses - + Über SQLiteStudio und deren Lizenzen About - + Über SQLiteStudio <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Freier, open-source, multiplattformfähiger SQLite Datenbankmanager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor und aktiver Verantwortlicher:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> Licenses - + Lizenzen Environment - + Programmumgebung Icon directories - + Icon Verzeichnisse Form directories - + Formular Verzeichnisse Plugin directories - + Plugin Verzeichnisse Application directory - + Programmverzeichnis SQLite 3 version: - + SQLite 3 Version: Configuration directory - + Konfigurationsverzeichnis Qt version: - + Qt Version: Portable distribution. - + Sollte hier vermutlich "Portable Version" heißen? + Portable Version MacOS X application boundle distribution. - + Das müsste mal genauer übersetzt werden. + MacOS X Programmbundle-Version Operating system managed distribution. - + Betriebssystemverwaltete Version. Copy - + Kopie <h3>Table of contents:</h3><ol>%2</ol> - + <h3>Inhaltsverzeichnis:</h3><ol>%2</ol> @@ -94,156 +96,156 @@ Bugs and ideas - + Fehler und Anregungen Reporter - + Gemeldet von E-mail address - + Ihre E-mail Adresse oder Ihr 'bugtracker' Login Log in - + Anmelden Short description - + Kurzbeschreibung Detailed description - + Ausführliche Fehlerbeschreibung Show more details - + Mehr Details SQLiteStudio version - + SQLiteStudio Version Operating system - + Betriebssystem Loaded plugins - + Geladene Plugins Send - + Absenden You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - + Sie können Ihre gemeldeten Fehler und Anregungen sehen, wenn Sie im Menü '%1' den Eintrag '%2' auswählen. A bug report sent successfully. - + Ihr Fehlerbericht wurde erfolgreich versendet. An error occurred while sending a bug report: %1 %2 - + Beim Absenden des Fehlerberichts ist ein Fehler aufgetreten: %1 %2 You can retry sending. The contents will be restored when you open a report dialog after an error like this. - + Sie können versuchen den Bericht erneut abzusenden. Ihr eingegebener Text wird nach einem Fehler wie diesem wieder hergestellt. An idea proposal sent successfully. - + Ihre Anregung wurde erfolgreich versendet. An error occurred while sending an idea proposal: %1 %2 - + Beim Absenden der Anregung ist ein Fehler aufgetreten: %1 %2 A bug report - + Fehlerbericht erfassen Describe problem in few words - + Beschreiben Sie das Problem mit wenigen Worten Describe problem and how to reproduce it - + Beschreiben Sie das Problem hier genauer und die Schritte, um es zu reproduzieren A new feature idea - + Anregung zu einer neuen Funktion erfassen A title for your idea - + Ein kurzer Titel für ihre Anregung Describe your idea in more details - + Beschreiben Sie hier Ihre Anregung ausführlich Reporting as an unregistered user, using e-mail address. - + Versenden als nicht registrierter Benutzer mittels E-mail Adresse Reporting as a registered user. - + Versenden als registrierter Benutzer Log out - + Abmelden Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - + Die Angabe Ihrer echten E-mail Adresse ermöglicht es uns Sie bzgl. Ihres Berichts zu kontaktieren. Erfahren Sie mehr dazu und klicken Sie den 'Hilfe' Knopf auf der rechtehn Seite. Enter vaild e-mail address, or log in. - + Geben Sie Ihre gültige E-mail Adresse oder Ihre Anmeldedaten an. Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - + Eine Kurzbeschreibung benötigt mindestens 10 Zeichen, maximal jedoch 100 Zeichen. Eine ausführlichere Beschreibung kann in dem Feld unten erfasst werden. Long description requires at least 30 characters. - + Eine ausführliche Beschreibung benötigt mindestens 30 Zeichen. @@ -252,39 +254,39 @@ Title - + Titel Reported at - + Gemeldet am URL - + URL Reports history - + Berichtsverlauf Clear reports history - + Lösche Berichtsverlauf Delete selected entry - + Gewählten Eintrag löschen Invalid response from server. - + Ungültige Antwort vom Server @@ -292,57 +294,58 @@ Log in - + Anmelden Credentials - + Hier fehlt mir der Kontext!!! + Überprüfung Login: - + Login: Password: - + Passwort: Validation - + Überprüfung Validate - + Überprüfe Validation result message - + Ergebnis der Überprüfung Abort - + Abbrechen A login must be at least 2 characters long. - + Ein Login Kürzel muss mindestens 2 Zeichen lang sein A password must be at least 5 characters long. - + Ein Passwort muss mindestens 5 Zeichen lang sein Valid - + Gültig @@ -350,87 +353,87 @@ Filter collations - + Kollationen filtern Collation name: - + Kollationsname: Implementation language: - + Sprache Databases - + Datenbanken Register in all databases - + In allen Datenbanken registrieren Register in following databases: - + In den folgenden Datenbanken registrieren Implementation code: - + Anweisungen Collations editor - + Editor für Kollationen Commit all collation changes - + Speichern aller Änderungen an Kollationen Rollback all collation changes - + Zurücknehmen aller Änderungen an Kollationen Create new collation - + Neue Kollation erstellen Delete selected collation - + Markierte Kollationen löschen Editing collations manual - + Kollationen manuell editieren Enter a non-empty, unique name of the collation. - + Geben Sie einen eindeutigen Namen für die Kollation ein. Pick the implementation language. - + Wählen Sie die Sprache aus. Enter a non-empty implementation code. - + Geben Sie eine eindeutige Vergleichsoperatorendefinition ein. Collations editor window has uncommited modifications. - + Der Editorfür Kollationen enthält nicht gespeicherte Änderungen. @@ -438,7 +441,7 @@ Pick a color - + Wählen Sie eine Farbe aus. @@ -446,22 +449,22 @@ Collation name: - + Name der Kollation: Named constraint: - + Name der Bedingung: Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. Enter a collation name. - + Geben Sie einen Namen für die Kollation ein. @@ -469,27 +472,27 @@ Default value: - + Standardwert: Named constraint: - + Benannte Bedingung: Enter a default value expression. - + Geben Sie einen Standardwert für den Ausdruck an Invalid default value expression: %1 - + Ungültiger Standardwert für Ausdruck: %1 Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. @@ -497,47 +500,47 @@ Column - + Spalte Name and type - + Name und Typ Scale - + Skalierung Precision - + Präzision Data type: - + Datentyp: Column name: - + Spaltenname: Size: - + Größe: Constraints - + Bedingungen Unique - + Eindeutigkeit @@ -548,132 +551,132 @@ Configure - + Konfigurieren Foreign Key - + Fremdschlüssel Collate - + Kollationieren Not NULL - + Nicht NULL Check condition - + Zustandsprüfung Primary Key - + Primärer Schlüssel Default - + Standard Advanced mode - + Erweiterter Modus Add constraint column dialog - + Bedingung hinzufügen Edit constraint column dialog - + Bedingung editieren Delete constraint column dialog - + Bedingung löschen Move constraint up column dialog - + Bedingung nach oben verschieben Move constraint down column dialog - + Bedingung nach unten verschieben Add a primary key column dialog - + Primärschlüssel zufügen Add a foreign key column dialog - + Fremdschlüssel zufügen Add an unique constraint column dialog - + Eindeutige Bedingung hinzufügen Add a check constraint column dialog - + Prüfungsbedingung hinzufügen Add a not null constraint column dialog - + Nicht-NULL Bedingung hinzufügen Add a collate constraint column dialog - + Kollationsbedingung hinzufügen Add a default constraint column dialog - + Standardbedingung hinzufügen Are you sure you want to delete constraint '%1'? column dialog - + Sind Sie sicher, dass Sie die folgende Bedingung löschen wollen: '%1'? Correct the constraint's configuration. - + Korrigiert die Konfiguration der Bedingung. This constraint is not officially supported by SQLite 2, but it's okay to use it. - + Diese Bedingung wird von SQLite 2 offiziell nicht unterstützt, aber sie kann dennoch benutzt werden. @@ -682,19 +685,19 @@ but it's okay to use it. Type column dialog constraints - + Typ Name column dialog constraints - + Name Details column dialog constraints - + Details @@ -702,47 +705,47 @@ but it's okay to use it. Foreign table: - + Fremde Tabelle: Foreign column: - + Fremde Spalte: Reactions - + Reaktionen Deferred foreign key - + Verzögerter Fremdschlüssel Named constraint - + Benannte Bedingung Constraint name - + Name der Bedingung Pick the foreign table. - + Wählen Sie die Fremdtabelle aus. Pick the foreign column. - + Wählen Sie die Fremdspalte aus. Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. @@ -750,33 +753,33 @@ but it's okay to use it. Autoincrement - + Automatisch hochzählend Sort order: - + Sortierfolge: Named constraint: - + Benannte Bedingung: On conflict: - + Bei Konflikt: Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. Autoincrement (only for %1 type columns) column primary key - + Automatische Zählung (nur für %1 Spaltentypen) @@ -784,17 +787,17 @@ but it's okay to use it. Named constraint: - + Benannte Bedingung: On conflict: - + Bei Konflikt: Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. @@ -803,85 +806,85 @@ but it's okay to use it. Column: %1 completer statusbar - + Spalte: %1 Table: %1 completer statusbar - + Tabelle: %1 Index: %1 completer statusbar - + Index: %1 Trigger: %1 completer statusbar - + Trigger: %1 View: %1 completer statusbar - + View: %1 Database: %1 completer statusbar - + Datenbank: %1 Keyword: %1 completer statusbar - + Schlüsselwort: %1 Function: %1 completer statusbar - + Funktion: %1 Operator: %1 completer statusbar - + Operator: %1 String completer statusbar - + Zeichenkette Number completer statusbar - + Nummer Binary data completer statusbar - + Binäre Daten Collation: %1 completer statusbar - + Kollation: %1 Pragma function: %1 completer statusbar - + Pragma Funktion: %1 @@ -890,618 +893,618 @@ but it's okay to use it. Configuration - + Konfiguration Search - + Suchen General - + Allgemein Keyboard shortcuts - + Tastaturkürzel Look & feel - + Aussehen Style - + Stil Fonts - + Schriftarten Colors - + Farben Plugins - + Plugins Code formatters - + Codeformatierer Data browsing - + Datenbearbeitung Data editors - + Dateneditoren Data browsing and editing - + Datenbearbeitung Number of data rows per page: - + Anzahl an Datenzeilen pro Seite: <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + <p>Wenn Daten in das Ergebnisfenster eingelesen werden, dann wird die Breite der Spalten dabei automatisch angepasst. Dieser Wert begrenzt maximale Breite für die automatische Breitenanpassung. Der Anwender kann die Spaltenbreite jedoch manuell über dieses Limit verbreitern.</p> Limit initial data column width to (in pixels): - + Begrenze die initiale Spaltenbreite im Ergebnisfenster auf (Pixel): Data types - + Datentypen Available editors: - + Verfügbare Editoren: Editors selected for this data type: - + Für diesen Datentyp ausgewählte Editoren: Schema editing - + Schema Number of DDL changes kept in history. - + Maximale Anzahl an DDL Änderungen im Verlauf. DDL history size: - + DDL Verlaufsgröße Don't show DDL preview dialog when commiting schema changes - + Zeige keine DDL Vorschau, wenn Schemaänderungen committed werden. SQL queries - + SQL Abfragen Number of queries kept in the history. - + Maximale Anzahl an SQL Abfragen im Verlauf. History size: - + Verlaufsgröße <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + <p>Wenn diese Option aktiviert ist und sich mehrere SQL Abfragen im Editorfenster befinden, dann wird nur die SQL Abfrage ausgeführt, in der sich der Cursor befindet. Ist diese Option nicht gesetzt, dann werden alle SQL Abfragen ausgeführt. Sie können die auszuführenden SQL Abfragen selbst bestimmen, indem Sie diese vor der Ausführung mit der Maus oder Tastatur markieren.</p> Execute only the query under the cursor - + Führt nur die Abfrage unter dem Cursor aus. Updates - + Updates Automatically check for updates at startup - + Prüfe vor dem Start automatisch auf Updates Session - + Sitzung Restore last session (active MDI windows) after startup - + Stelle letzte Sitzung nach dem Start wieder her (aktive MDI Fenster) Filter shortcuts by name or key combination - + Filtere Tastaturkürzel nach Name oder Tastenkombination Action - + Aktion Key combination - + Tastenkombination Language - + Sprache Changing language requires application restart to take effect. - + Die Änderung der Sprache erfordert einen Neustart des Programms. Compact layout - + Kompaktes Layout <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + <p>Das kompakte Layout reduziert alle Lücken und Abstände der Oberfläche auf ein Minimum, um mehr Platz für die Darstellung der Daten zu schaffen. Die Oberfläche sieht dann zwar nicht mehr sehr ästhetisch aus, aber man hat mehr Daten im Überblick.</p> Use compact layout - + Benutze kompaktes Layout General.CompactLayout - + Standard.KompaktesLayout Database list - + Liste der Datenbanken If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. - + Wenn die Option deaktiviert ist, werden die Spalten in der Reihenfolge sortiert in der sie im CREATE TABLE Statement angegeben wurden. Sort table columns alphabetically - + Tabellenspalten alphabetisch sortieren Expand tables node when connected to a database - + Tabellenknoten aufklappen, wenn eine Datenbank verbunden ist <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> - + <p>Zusätzliche Bezeichnungen sind jene, die neben den Namen der Datenbankliste angezeigt werden (sie sind normalerweise blau gefärbt, es sei denn dies wurde umkonfiguriert). Ist diese Option aktiviert, dann werden diese Bezeichnungen angezeigt für Datenbanken, ungültige Datenbanken und zusammengefasste Knoten (Spalten-, Index- und Triggergruppen). Für mehr Details siehe die folgenden optionen.<p> Display additional labels on the list - + Zeige zusätzliche Bezeichnungen in der Liste an For regular tables labels will show number of columns, indexes and triggers for each of tables. - + Für normale Tabellen enthält die Bezeichnung die Anzahl der Spalten, Indizes und Trigger einer jeden Tabelle. Display labels for regular tables - + Zeigt Bezeichnungen für normale Tabellen an Virtual tables will be marked with a 'virtual' label. - + Virtuelle Tabellen werden mit einem 'virtuell' Kürzel versehen. Display labels for virtual tables - + Zeige Bezeichnungen für virtuelle Tabellen Expand views node when connected to a database - + Knoten aufklappen, wenn eine Datenbank verbunden ist If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) - + Wenn die Option deaktiviert ist, werden die Objekte in der Reihenfolge sortiert in der sie in der sqlite_master Tabelle angezeigt werden (entspricht der Reihenfolge in der sie angelegt worden sind) Sort objects (tables, indexes, triggers and views) alphabetically - + Objekte alphabetisch sortieren Display system tables and indexes on the list - + Zeige Systemtabellen und Indizes in der Liste an Table windows - + Tabellenfenster When enabled, Table Windows will show up with the data tab, instead of the structure tab. - + Wenn die Option aktiviert ist, dann wird im Tabellenfenster der Reiter "Daten" angezeigt statt "Strukturen". Open Table Windows with the data tab for start - + Öffnet das Tabellenfenster mit dem Reiter "Daten" im Vordergrund View windows - + Viewfenster When enabled, View Windows will show up with the data tab, instead of the structure tab. - + Wenn die Option aktiviert ist, dann wird im Viewfenster der Reiter "Daten" angezeigt statt "Strukturen". Open View Windows with the data tab for start - + Öffnet das Viewfenster mit dem Reiter "Daten" im Vordergrund Main window dock areas - + Dockingbereiche des Hauptfensters Left and right areas occupy corners - + Linke und rechte Bereiche belegen die Ecken Top and bottom areas occupy corners - + Obere und untere Bereiche belegen die Ecken Hide built-in plugins - + Verberge eingebaute Plugins Current style: - + Aktueller Stil: Preview - + Vorschau Enabled - + Aktiviert Disabled - + Deaktiviert Active formatter plugin - + Aktives Formatierungsplugin SQL editor font - + Schriftart des SQL Editors Database list font - + Schriftart der Datenbankliste Database list additional label font - + Zusätzliche Bezeichnungen in der Datenbankliste Data view font - + Schriftart der Ergebnisansicht Status field font - + Schriftart des Statusfelds SQL editor colors - + Farben des SQL Editors Current line background - + Hintergrundfarbe der aktuellen Zeile <p>SQL strings are enclosed with single quote characters.</p> - + <p>SQL Zeichenketten sind mit einfachen Anführungszeichen umschlossen.</p> String foreground - + Vordergrundfarbe von Zeichenketten <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + <p>Bind Parameter sind Platzhalter für Werte, die der Anwender eingibt. Sie haben dabei eine der folgenden Formen:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> Bind parameter foreground - + Vordergrundfarbe von Bind Parametern Highlighted parenthesis background - + Hintergrundfarbe von hervorgehobener Klammern <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + <p>BLOB Werte sind hexadezimale Werte wie z.B.:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> BLOB value foreground - + Vordergrundfarbe von BLOB Werten Regular foreground - + Reguläre Vordergrundfarbe Line numbers area background - + Hintergrundfarbe der Zeilennummernleiste Keyword foreground - + Vordergrundfarbe von Schlüsselwörtern Number foreground - + Vordergrundfarbe von Ziffern Comment foreground - + Vordergrundfarbe von Kommentaren <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + <p>Gültige Objekte sind Namen von Tabellen, Indizes, Triggern oder Views die in der SQLite Datenbank existieren.</p> Valid objects foreground - + Vordergrundfarbe von gültigen Objekten Data view colors - + Farben der Ergebnisansicht <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - + <p>Jede Datenänderung wird mit dieser Farbe kenntlich gemacht, bis die geänderten Daten in die Datenbank zurückgeschrieben worden sind.</p> Uncommited data outline color - + Rahmenfarbe von nicht gespeicherten Daten <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - + <p>Tritt beim Speichern einer Änderung ein Problem auf, dann wird die problematische Zelle mit dieser Farbe markiert.</p> Commit error outline color - + Rahmenfarbe für fehlerhafte Daten NULL value foreground - + Vordergrundfarbe für NULL Werte Deleted row background - + Hintergrundfarbe von gelöschten Zeilen Database list colors - + Farben der Datenbankliste <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + <p>Zusätzliche Bezeichnungen sind solche, die z.B. die SQLite Version oder die Anzahl an Einträgen in einer Baumliste usw. anzeigen.</p> Additional labels foreground - + Vordergrundfarbe für zusätzliche Bezeichnungen Status field colors - + Farben des Statusfelds Information message foreground - + Vordergrundfarbe für Infomeldungen Warning message foreground - + Vordergrundfarbe für Warnmeldungen Error message foreground - + Vordergrundfarbe für Fehlermeldungen Description: plugin details - + Bezeichnung: Category: plugin details - + Kategorie: Version: plugin details - + Version: Author: plugin details - + Autor: Internal name: plugin details - + Interner Name: Dependencies: plugin details - + Abhängigkeiten: Conflicts: plugin details - + Konflikte: Plugin details - + Plugin Details Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. - + Plugins werden direkt beim Aktivieren/Deaktivieren geladen bzw. entfernt, die modifizierte Pluginliste wird jedoch erst beim Bestätigen und Schließen des Konfigurationsfensters gespeichert. %1 (built-in) plugins manager in configuration dialog - + %1 (eingebaut) Details - + Details No plugins in this category. - + Keine Plugins in dieser Kategorie. Add new data type - + Neuen Datentypen zufügen Rename selected data type - + Markierten Datentypen umbenennen Delete selected data type - + Markierten Datentypen löschen Help for configuring data type editors - + Hilfe zur Konfiguration des Datentypen Editors @@ -1509,27 +1512,27 @@ but it's okay to use it. The condition - + Der Zustand: Named constraint: - + Benannte Bedingung: On conflict - + Bei Konflikt Enter a valid condition. - + Geben Sie einen gültigen Zustand ein. Enter a name of the constraint. - + Geben Sie einen Namen für die Bedingung ein. @@ -1538,67 +1541,67 @@ but it's okay to use it. New constraint constraint dialog - + Neue Bedingung Create constraint dialog - + Erstellen Edit constraint dialog window - + Bedingung editieren Apply constraint dialog - + Übernehmen Primary key table constraints - + Primärer Schlüssel Foreign key table constraints - + Fremdschlüssel Unique table constraints - + Eindeutigkeit Not NULL table constraints - + Nicht NULL Check table constraints - + Prüfung Collate table constraints - + Kollation Default table constraints - + Standard @@ -1607,37 +1610,37 @@ but it's okay to use it. Table table constraints - + Tabelle Column (%1) table constraints - + Spalte (%1) Scope table constraints - + Bereich Type table constraints - + Typ Details table constraints - + Details Name table constraints - + Name @@ -1645,7 +1648,7 @@ but it's okay to use it. SQLiteStudio CSS console - + SQLiteStudio CSS Konsole @@ -1654,118 +1657,119 @@ but it's okay to use it. Filter data data view - + Daten filtern Grid view - + Gitteransicht Form view - + Formularansicht Refresh table data data view - + Aktualisiere Tabellendaten First page data view - + Erste Seite Previous page data view - + Vorherige Seite Next page data view - + Nächste Seite Last page data view - + Letzte Seite Apply filter data view - + Filter anwenden Commit changes for selected cells data view - + Änderungen für die selektierten Zellen speichern Rollback changes for selected cells data view - + Änderungen für die selektierten Zellen zurücknehmen Show grid view of results sql editor - + Zeige Ergebnismenge in der Gitteransicht Show form view of results sql editor - + Zeige Ergebnismenge in der Formularansicht Filter by text data view - + Nach Text filtern Filter by the Regular Expression data view - + Nach regulärem Ausdruck filtern Filter by SQL expression data view - + Nach einem SQL Ausdruck filtern Tabs on top data view - + Reiterleiste oben Tabs at bottom data view - + Reiterleiste unten Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Gesamtanzahl der Zeilen wird ermittelt. +Das Aufrufen anderer Seiten ist erst nach Abschluss der Zählung möglich. Row: %1 - + Zeile: %1 @@ -1773,97 +1777,97 @@ Browsing other pages will be possible after the row counting is done. Convert database - + Konvertiere Datenbank Source database - + Quelldatenbank Source database version: - + Version der Quelldatenbank: Target database - + Zieldatenbank Target version: - + Version der Zieldatenbank: This is the file that will be created as a result of the conversion. - + Dies ist die Datei, die durch die Konvertierung erzeut werden wird. Target file: - + Zieldatei: Name of the new database: - + Name der neuen Datenbank: This is the name that the converted database will be added to SQLiteStudio with. - + Mit diesem Namen wird die konvertierte Datenbank SQLiteStudio zugefügt werden. Select source database - + Quelldatenbank auswählen Enter valid and writable file path. - + Geben Sie einen gültigen und beschreibbaren Dateipfad ein. Entered file exists and will be overwritten. - + Die angegebene Datei existiert bereits und wird überschrieben werden. Enter a not empty, unique name (as in the list of databases on the left). - + Geben Sie einen eindeutigen Namen an (so wie links in der Datenbankliste) No valid target dialect available. Conversion not possible. - + Es ist kein gültiger Zieldialekt verfügbar. Die Konvertierung kann nicht durchgeführt werden. Select valid target dialect. - + Wählen Sie einen gültigen Zieldialekt aus. Database %1 has been successfully converted and now is available under new name: %2 - + Datenbank %1 wurde erfolgreich konvertiert und ist verfügbar unter dem neuen Namen: %2 SQL statements conversion - + SQL Statements Konvertierung Following error occurred while converting SQL statements to the target SQLite version: - + Folgender Fehler ist aufgetreten, während der Konvertierung von SQL Statements in die Ziel-SQLite Version: Would you like to ignore those errors and proceed? - + Möchten Sie diese Fehler ignorieren und fortfahren? @@ -1871,109 +1875,109 @@ Browsing other pages will be possible after the row counting is done. Database - + Datenbank Database type - + Datenbanktyp Database driver - + Datenbanktreiber Generate automatically - + Automatisch generieren Options - + Optionen Permanent (keep it in configuration) - + Permanent (in der Konfiguration behalten) Test connection - + Verbindung testen Create new database file - + Neue Datenbank erzeugen File - + Datei Name (on the list) - + Name (in der Liste) Generate name basing on file path - + Leitet den Namen vom Dateipfad ab <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - + <p>Wenn diese Option aktiviert ist, wird die Datenbank in der Konfiguration gespeichert und bei jedem Start von SQLiteStudio wieder hergestellt.</p> Browse for existing database file on local computer - + Lokalen Computer nach Datenbankdateien durchsuchen Browse - + Durchsuchen Enter an unique database name. - + Geben Sie einen eindeutigen Datenbanknamen ein. This name is already in use. Please enter unique name. - + Der Name wird bereits benutzt, bitte geben Sie einen freien, eindeutigen Namen ein. Enter a database file path. - + Geben Sie einen Dateipfad für die Datenbank ein. This database is already on the list under name: %1 - + Die Datenbank ist bereits unter folgendem Namen in der Liste enthalten: %1 Select a database type. - + Wählen Sie einen Datebanktypen aus. Auto-generated - + Automatisch generiert Type the name - + Geben Sie den Namen ein @@ -1981,47 +1985,47 @@ Browsing other pages will be possible after the row counting is done. Delete table - + Tabelle löschen Are you sure you want to delete table %1? - + Sind Sie sicher, dass Sie die Tabelle %1 löschen möchten? Delete index - + Index löschen Are you sure you want to delete index %1? - + Sind Sie sicher, dass Sie den Index %1 löschen möchten? Delete trigger - + Trigger löschen Are you sure you want to delete trigger %1? - + Sind Sie sicher, dass Sie den Trigger %1 löschen möchten? Delete view - + View löschen Are you sure you want to delete view %1? - + Sind Sie sicher, dass Sie den View %1 löschen möchten? Error while dropping %1: %2 - + Fehler beim Löschen: %1 %2 @@ -2029,353 +2033,355 @@ Browsing other pages will be possible after the row counting is done. Databases - + Datenbanken Filter by name - + Nach Name filtern Copy - + Kopieren Paste - + Einfügen Select all - + Alles auswählen Create a group - + Gruppe erstellen Delete the group - + Diese Gruppe löschen Rename the group - + Gruppe umbenennen Add a database - + Datenbank hinzufügen Edit the database - + Datenbank editieren Remove the database - + Datenbank entfernen Connect to the database - + Mit der Datenbank verbinden Disconnect from the database - + Verbindung zur Datenbank trennen Import - + Import Export the database - + Datenbank exportieren Convert database type - + Datenbanktyp konvertieren Vacuum - + ??? + Vakuum Integrity check - + Integritätsprüfung Create a table - + Tabelle erstellen Edit the table - + Datenbank editieren Delete the table - + Tabelle löschen Export the table - + Tabelle exportieren Import into the table - + In die Tabelle importieren Populate table - + Tabelle füllen Create similar table - + Erzeuge identische Tabelle Reset autoincrement sequence - + Automatischen Zähler zurücksetzen Create an index - + Index erstellen Edit the index - + Index editieren Delete the index - + Index löschen Create a trigger - + Trigger erstellen Edit the trigger - + Trigger editieren Delete the trigger - + Trigger löschen Create a view - + View erstellen Edit the view - + View editieren Delete the view - + View löschen Add a column - + Spalte zufügen Edit the column - + Spalte editieren Delete the column - + Spalte löschen Delete selected items - + Gewählte Einträge löschen Clear filter - + Filter zurücksetzen Refresh all database schemas - + Alle Datenbankschemen aktualisieren Refresh selected database schema - + Alle markierten Datenbankschemen aktualisieren Erase table data - + Tabellendaten löschen Database - + Datenbank Grouping - + Gruppieren Create group - + Gruppe erstellen Group name - + Gruppenname Entry with name %1 already exists in group %2. - + Der Eintrag mit Namen %1 existiert bereits in der Gruppe %2 Delete group - + Gruppe löschen Are you sure you want to delete group %1? All objects from this group will be moved to parent group. - + Sind Sie sicher, dass Sie die Gruppe %1 löschen möchten? +Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben. Delete database - + Datenbank löschen Are you sure you want to delete database '%1'? - + Sind Sie sicher, dass Sie die Datenbank '%1' löschen möchten? Cannot import, because no import plugin is loaded. - + Der Import kann nicht durchgeführt werden, da kein Import Plugin geladen ist. Cannot export, because no export plugin is loaded. - + Export fehlgeschlagen, da kein Export Plugins geladen sind. Error while executing VACUUM on the database %1: %2 - + Fehler beim Ausführen des VACUUM-Befehls auf die Datenbank %1: %2 VACUUM execution finished successfully. - + VACUUM erfolgreich abgeschlossen. Integrity check (%1) - + Integritätsprüfung (%1) Reset autoincrement - + Autoincrement zurücksetzen Are you sure you want to reset autoincrement value for table '%1'? - + Sind Sie sicher, dass Sie den Autoincrement Wert für die Tabelle '%1' zurücksetzen möchten? An error occurred while trying to reset autoincrement value for table '%1': %2 - + Ein Fehler ist aufgetreten beim Zurücksetzen des Autoincrementwertes für die Tabelle '%1': %2 Autoincrement value for table '%1' has been reset successfly. - + Autoincrementwert für die Tabelle '%1' wurde erfolgreich zurückgesetzt. Are you sure you want to delete all data from table '%1'? - + Sind Sie sicher, dass Sie alle Daten aus Tabelle '%1' löschen möchten? An error occurred while trying to delete data from table '%1': %2 - + Beim Löschen von Daten aus Tabelle '%1' ist folgender Fehelr aufgetreten: %2 All data has been deleted for table '%1'. - + Es wurden alle Daten aus Tabelle '%1' gelöscht. Following objects will be deleted: %1. - + Folgende Objekte werden gelöscht: %1. Following databases will be removed from list: %1. - + Folgende Datenbanken werden aus der Liste entfernt: %1. Remainig objects from deleted group will be moved in place where the group used to be. - + Die aus der gelöschten Gruppe verbleibenden Objekte werden an die Position der gelöschten Gruppe verschoben. %1<br><br>Are you sure you want to continue? - + %1<br><br>Sind Sie sicher, dass Sie fortfahren möchten? Delete objects - + Objekte löschen @@ -2384,25 +2390,25 @@ All objects from this group will be moved to parent group. error dbtree labels - + Fehler (system table) database tree label - + (Systemtabelle) (virtual) virtual table label - + (Virtual) (system index) database tree label - + (Systemindex) @@ -2411,122 +2417,123 @@ All objects from this group will be moved to parent group. Database: %1 dbtree tooltip - + Datenbank: %1 Version: dbtree tooltip - + Version: File size: dbtree tooltip - + Dateigröße: Encoding: dbtree tooltip - + Kodierung: Error: dbtree tooltip - + Fehlerbeschreibung: Table : %1 dbtree tooltip - + Tabelle: %1 Columns (%1): dbtree tooltip - + Spalten (%1) Indexes (%1): dbtree tooltip - + Indizes (%1) Triggers (%1): dbtree tooltip - + Trigger (%1) Copy - + Kopieren Move - + Verschieben Include data - + Inklusive Daten Include indexes - + Inklusive Indizes Include triggers - + Inklusive Trigger Abort - + Abbrechen Referenced tables - + Referenzierte Tabellen Do you want to include following referenced tables as well: %1 - + Möchten Sie die folgenden referenzierten Tabellen mit einbeziehen? %1 Name conflict - + Namenskonflikt Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + Folgende Objekte existieren bereits in der Datenbank. +Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den Vorgang abzubrechen: SQL statements conversion - + SQL Statement Konvertierung Following error occurred while converting SQL statements to the target SQLite version: - + Folgender Fehler trat auf bei der Konvertierung von SQL Statements in die SQLite Zielversion: Would you like to ignore those errors and proceed? - + Möchten Sie diese Fehler ignorieren und fortfahren? @@ -2534,19 +2541,21 @@ Please enter new, unique name, or press '%1' to abort the operation: Filter by database: - + Nach Datenbank filtern -- Queries executed on database %1 (%2) -- Date and time of execution: %3 %4 - + -- Abfragen werden ausgeführt auf Datenbank %1 (%2) +-- Datum und Ausführungszeitpunkt: %3 +%4 DDL history - + DDL Verlauf @@ -2554,12 +2563,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Queries to be executed - + Auszuführende Abfragen Don't show again - + Nicht wieder anzeigen @@ -2567,7 +2576,7 @@ Please enter new, unique name, or press '%1' to abort the operation: SQLiteStudio Debug Console - + SQLiteStudio Debug Konsole @@ -2575,135 +2584,135 @@ Please enter new, unique name, or press '%1' to abort the operation: Query - + Abfrage History - + Verlauf Results in the separate tab - + Ergebnisse in separatem Reiter Results below the query - + Ergebnisse unter der Abfrage SQL editor %1 - + SQL Editor %1 Results - + Ergebnisse Execute query - + Abfrage ausführen Explain query - + Abfrage ausführen (explain) Clear execution history sql editor - + Ausführungsverlauf löschen Export results sql editor - + Ergebnisse exportieren Create view from query sql editor - + View aus der Abfrage erstellen Previous database - + Vorherige Datenbank Next database - + Nächste Datenbank Show next tab sql editor - + Nächsten Reiter zeigen Show previous tab sql editor - + Vorherigen Reiter zeigen Focus results below sql editor - + Fokus auf die Ergebnisse unten Focus SQL editor above sql editor - + Fokus auf den SQL Editor oben Active database (%1/%2) - + Aktive Datenbank (%1/%2) Query finished in %1 second(s). Rows affected: %2 - + Abfrage in %1 Sekunde(n) abgeschlossen. %2 Zeile(n) betroffen Query finished in %1 second(s). - + Abfrage in %1 Sekunde(n) abgeschlossen. Clear execution history - + Lösche Ausführungsverlauf Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + Sind Sie sicher, dass Sie den gesamten SQL Ausführungsverlauf löschen möchten? Dieser Vorgang kann nicht rückgängig gemacht werden. Cannot export, because no export plugin is loaded. - + Es kann nicht exportiert werden, da kein Export Plugin geladen ist. No database selected in the SQL editor. Cannot create a view for unknown database. - + Es ist keine Datenbank im SQL Editor selektiert. Für eine unbekannte Datenbank kann kein View erzeugt werden. Editor window "%1" has uncommited data. - + Das Editorfenster "%1" hat ungespeicherte Daten. @@ -2711,17 +2720,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Errors - + Fehler Following errors occured: - + Folgende Fehler sind aufgetreten: Would you like to proceed? - + Möchten Sie fortsetzen? @@ -2729,210 +2738,213 @@ Please enter new, unique name, or press '%1' to abort the operation: Export - + Exportieren What do you want to export? - + Was möchten Sie exportieren? A database - + Eine Datenbank A single table - + Eine einzelne Tabelle Query results - + Abfrageergebnisse Table to export - + Zu exportierende Tabelle Database - + Datenbank Table - + Tabelle Options - + Optionen When this option is unchecked, then only table DDL (CREATE TABLE statement) is exported. - + Wenn die Option deaktiviert ist, dann wird nur das Tabellen DDL (CREATE TABLE Statement) exportiert. Export table data - + Tabellendaten exportieren Export table indexes - + Tabellenindizes exportieren Export table triggers - + Tabellentrigger exportieren Note, that exporting table indexes and triggers may be unsupported by some output formats. - + Hinweis: Das Exportieren von Tabellen, Indizes und Triggern könnte von einigen Ausgabeformaten nicht unterstützt werden. Select database objects to export - + Wählen Sie die zu exportierenden Datebankobjekte aus. Export data from tables - + Daten aus Tabellen exportieren Select all - + Alles auswählen Deselect all - + Auswahl aufheben Database: - + Datenbank: Query to export results for - + Abfrage deren Ergebnisse exportiert werden sollen Query to be executed for results: - + ??? + Auszuführende Abfrage... : Export format and options - + Exportformat und Optionen Export format - + Exportformat Output - + Ausgabe Exported file path - + ??? + Exportverzeichnis Clipboard - + Zwischenablage File - + Datei Exported text encoding: - + Exportierte Textkodierung Export format options - + Optionen des Exportformats Cancel - + Abbrechen Select database to export. - + Wählen Sie die zu exportierenden Datebank aus. Select table to export. - + Wählen Sie die zu exportierenden Tabellen aus. Enter valid query to export. - + ??? + Geben Sie eine gültige Abfrage für den Export an. Select at least one object to export. - + Wählen Sie ein zu exportierendes Datebankobjekt aus. You must provide a file name to export to. - + Sie müssen einen Namen für die Exportdatei angeben. Path you provided is an existing directory. You cannot overwrite it. - + Das von Ihnen angegebene Verzeichnis existiert bereits. Es kann nicht überschrieben werden. The directory '%1' does not exist. - + Das Verzeichnis '%1' existiert nicht. The file '%1' exists and will be overwritten. - + Die Datei '%1' existiert bereits und wird überschrieben werden. All files (*) - + Alle Dateien (*) Pick file to export to - + Wählen Sie eine Datei aus in die exportiert werden soll. Internal error during export. This is a bug. Please report it. - + Es trat ein interner Fehler während des Exportvorgangs auf. Dies ist ein Fehler, bitte melden Sie ihn dem Programmautor. @@ -2941,7 +2953,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Choose font font configuration - + Schriftart auswählen @@ -2949,7 +2961,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Active SQL formatter plugin - + Aktives SQL Formatierungsplugin @@ -2958,49 +2970,49 @@ Please enter new, unique name, or press '%1' to abort the operation: Commit row form view - + Zeile speichern (Commit) Rollback row form view - + Zeile rückgängig (Rollback) First row form view - + Erste Zeile Previous row form view - + Vorherige Zeile Next row form view - + Nächste Zeile Last row form view - + Letzte Zeile Insert new row form view - + Neue Zeile einfügen Delete current row form view - + Aktuelle Zeile löschen @@ -3008,159 +3020,160 @@ Please enter new, unique name, or press '%1' to abort the operation: Filter funtions - + Filterfunktionen Function name: - + Funktionsname: Implementation language: - + Implementationssprache: Type: - + Typ: Input arguments - + Eingabeargumente Undefined - + Undefiniert Databases - + Datenbanken Register in all databases - + In allen Datenbanken registrieren Register in following databases: - + In den folgenden Datenbanken registrieren: Initialization code: - + Initialisierungsanweisungen: Function implementation code: - + Funktionsanweisungen: Final step implementation code: - + Abschlussanweisungen SQL function editor - + SQL Funktionseditor Commit all function changes - + Speichern aller Funktionsänderungen Rollback all function changes - + Zurücknehmen aller Funktionsänderungen Create new function - + Neue Funktion erstellen Delete selected function - + Ausgewählte Funktion löschen Custom SQL functions manual - + Anleitung zu 'Benutzerdefinierte SQL Funktionen' Add function argument - + Funktionsargument zufügen Rename function argument - + Funktionsargument umbenennen Delete function argument - + Funktionsargument löschen Move function argument up - + Funktionsargument hochschieben Move function argument down - + Funktionsargument runterschieben Scalar - + Skalar Aggregate - + Aggregat Enter a non-empty, unique name of the function. - + Geben Sie einen eindeutigen Namen für die Funktion ein. Pick the implementation language. - + Wählen Sie die Sprache aus. Per step code: - + evtl. Einzelschrittanweisung??? + Pro Schritt Anweisung Enter a non-empty implementation code. - + Geben Sie die Anweisungen ein. argument new function argument name in function editor window - + Argument Functions editor window has uncommited modifications. - + Der Editorfür Funktionen enthält nicht gespeicherte Änderungen. @@ -3168,102 +3181,102 @@ Please enter new, unique name, or press '%1' to abort the operation: Import data - + Daten importieren Table to import to - + Tabelle in die importiert werden soll Table - + Tabelle Database - + Datenbank Data source to import from - + Datenquelle von der aus importiert werden soll Data source type - + Datenquellentyp Options - + Optionen Input file: - + Eingabedatei: Text encoding: - + Textkodierung: <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> - + <p>Wenn diese Option aktiviert ist, wird jede Verletzung von Bedingungen oder ein ungültiges Datenformat (falsche Anzahl an Spalten) oder jedes andere Problem, das während des Imports auftritt, ignoriert und der Import wird fortgesetzt.</p> Ignore errors - + Fehler ignorieren Data source options - + Datenquellenoptionen Cancel - + Abbrechen If you type table name that doesn't exist, it will be created. - + Wenn Sie einen Tabellenname eingeben, der noch nicht existiert, dann wird diese neue Tabelle erzeugt werden. Enter the table name - + Datenbankname eingeben Select import plugin. - + Importplugin auswählen You must provide a file to import from. - + Sie müssen den Namen der Importdatei angeben. The file '%1' does not exist. - + Die Datei '%1' existiert nicht. Path you provided is a directory. A regular file is required. - + Der von Ihnen angegebene Pfad ist ein Verzeichnis. Es wird jedoch eine Datei benötigt. Pick file to import from - + Wählen Sie eine Datei aus von der importiert werden soll. @@ -3272,102 +3285,103 @@ Please enter new, unique name, or press '%1' to abort the operation: Index - + Index On table: - + Auf Tabelle: Index name: - + Indexname: Partial index condition - + Partieller Indexzustand Unique index - + Einzigartiger Index Column - + Spalte Collation - + Kollation Sort - + Sortierung DDL - + DDL Tried to open index dialog for closed or inexisting database. - + Es wurde versucht den Index-Dialog für eine geschlossene oder nicht existente Datenbank zu öffnen. Could not process index %1 correctly. Unable to open an index dialog. - + Der Index %1 kann nicht vollständig bearbeitet werden, da der Index-Dialog nicht geöffnet werden kann. Pick the table for the index. - + Tabelle für den Index auswählen. Select at least one column. - + Mindestens eine Spalte auswählen. Enter a valid condition. - + Geben Sie einen gültigen Zustand ein. default index dialog - + Standard Sort order table constraints - + Sortierung Error index dialog - + Fehler Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? - + Der eindeutige Index kann nicht erzeigt werden, da Werte in den selektierten Spalten nicht eundeutig sind. Möchten Sie die zugehörige SELECT Abfrage ausführen, um die uneindeutigen Werte zu sehen? An error occurred while executing SQL statements: %1 - + Fehler beim Ausführen des folgenden SQL Statments: +%1 @@ -3375,12 +3389,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Language - + Sprache Please choose language: - + Bitte Sprache auswählen: @@ -3388,298 +3402,298 @@ Please enter new, unique name, or press '%1' to abort the operation: Database toolbar - + Datenbankleiste Structure toolbar - + Bearbeitungsleiste Tools - + Werkzeuge Window list - + Fensterliste View toolbar - + Ansichtenleiste Configuration widgets - + Konfigurationshelfer Syntax highlighting engines - + Syntaxhervorhebungen Data editors - + Dateneditoren Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Ablauf im Debugmodus. Zum Öffnen der Debugkonsole drücken Sie %1 oder wählen Menü 'Hilfe' den Eintrag 'Debugkonsole öffnen' aus. Running in debug mode. Debug messages are printed to the standard output. - + Ablauf im Debugmodus. Debugmeldungen werden in der Standardausgabe angezeigt.. You need to restart application to make the language change take effect. - + Das Programm muss neu gestartet werden, damit die Änderung der Sprache wirksam wird. Open SQL editor - + SQL Editor öffnen Open DDL history - + DDL Verlauf öffnen Open SQL functions editor - + Open collations editor - + Editor für Kollationen öffnen Import - + Importieren Export - + Exportieren Open configuration dialog - + Einstellungen Tile windows - + Alle Fenster aufteilen Tile windows horizontally - + Alle Fenster horizontal aufteilen Tile windows vertically - + Alle Fenster vertikal aufteilen Cascade windows - + Alle Fenster kaskadiert aufteilen Next window - + Nächstes Fenster Previous window - + Vorheriges Fenster Hide status field - + Statusfeld verbergen Close selected window - + Ausgewähltes Fenster schließen Close all windows but selected - + Alle anderen Fenster schließen Close all windows - + Alle Fenster schließen Restore recently closed window - + Zuletzt geöffnetes Fenster wiederherstellen Rename selected window - + Ausgewähltes Fenster umbenennen Open Debug Console - + Debug Konsole öffnen Open CSS Console - + CSS Konsole öffnen Report a bug - + Fehler melden Propose a new feature - + Eine neue Programmfunktion vorschlagen About - + Über SQLiteStudio Licenses - + Lizenzen Open home page - + Homepage aufrufen Open forum page - + Forum aufrufen User Manual - + Bedienungsanleitung SQLite documentation - + SQLite Dokumentation Report history - + Verlauf gemeldeter Fehler Check for updates - + Auf Updates prüfen Database menubar - + Datenbank Structure menubar - + Struktur View menubar - + Ansicht Window list menubar view menu - + Fensterliste Tools menubar - + Werkzeuge Help - + Hilfe Could not set style: %1 main window - + Der folgende Stil kann nicht gesetzt werden: %1 Cannot export, because no export plugin is loaded. - + Es kann nicht exportiert werden, da kein Export Plugin geladen ist. Cannot import, because no import plugin is loaded. - + Es kann nicht importiert werden, da kein Import Plugin geladen ist. Rename window - + Fenster umbenennen Enter new name for the window: - + Geben Sie einen neuen Namen für das Fenster ein. New updates are available. <a href="%1">Click here for details</a>. - + Neues Update verfügbar. <a href="%1">Weitere Details</a>. You're running the most recent version. No updates are available. - + Sie haben bereits die aktuellste Version. Keine Update verfügbar. Database passed in command line parameters (%1) was already on the list under name: %2 - + Die Datenbank, die mittels Programmparameter übergeben wurde (%1), war bereits in der Liste unter dem Namen %2 vorhanden. Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Die Datenbank, die mittels Programmparameter übergeben wurde (%1), wurde in der Liste termporär unter dem Namen %2 zugefügt. Could not add database %1 to list. - + Die Datenbank %1 konnte nicht hinzugefügt werden. @@ -3687,17 +3701,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommited changes - + Nicht gespeicherte Änderungen Close anyway - + Trotzdem schließen Don't close - + Nicht schließen @@ -3706,29 +3720,29 @@ Please enter new, unique name, or press '%1' to abort the operation: Null value multieditor - + NULL Wert Configure editors for this data type - + Konfigurationseditoren für diesen Datentyp Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Das Dateneditor Plugin '%1' ist nicht geladen, obwohl es für den '%1' Datentypen als Editor definiert ist. Deleted multieditor - + Gelöscht Read only multieditor - + Nur lesend @@ -3736,7 +3750,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Boolean - + Boolean @@ -3744,7 +3758,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date - + Datum @@ -3752,7 +3766,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date & time - + Datum & Zeit @@ -3760,7 +3774,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Hex - + Hexadezimal @@ -3769,7 +3783,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Number numeric multi editor tab name - + Nummer @@ -3777,42 +3791,43 @@ Please enter new, unique name, or press '%1' to abort the operation: Text - + Text Tab changes focus - + Hier fehlt mir der Kontext... Nacharbeiten nötig. + Reiter Änderungen Fokus Cut - + Ausschneiden Copy - + Kopieren Paste - + Einfügen Delete - + Löschen Undo - + Rückgängig Redo - + Wiederholen @@ -3820,7 +3835,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Time - + Zeit @@ -3828,53 +3843,53 @@ Please enter new, unique name, or press '%1' to abort the operation: New constraint - + Neue Bedingung Primary Key new constraint dialog - + Primärschlüssel Foreign Key new constraint dialog - + Fremdschlüssel Unique new constraint dialog - + Einzigartig Check new constraint dialog - + Prüfung Not NULL new constraint dialog - + Nicht NULL Collate new constraint dialog - + Kollation Default new constraint dialog - + Standard @@ -3882,52 +3897,52 @@ Please enter new, unique name, or press '%1' to abort the operation: SQLiteStudio updates - + SQLiteStudio Updates New updates are available! - + Neues Update verfügbar! Component - + Komponente Current version - + Derzeitige Version Update version - + Neue Version Check for updates on startup - + Beim Programmstart auf Updates prüfen Update to new version! - + Auf neue Version aktualisieren! The update will be automatically downloaded and installed. This will also restart application at the end. - + Das Update wird automatisch heruntergeladen und installiert. Die Anwendung wird daraufhin neugestartet. Not now. - + Nicht jetzt. Don't install the update and close this window. - + Update nicht installieren und Fenster schließen. @@ -3935,12 +3950,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Populating configuration - + Konfiguration auffüllen Configuring <b>%1</b> for column <b>%2</b> - + Konfiguriere <b>%1</b> für Spalte <b>%2</b> @@ -3948,63 +3963,63 @@ Please enter new, unique name, or press '%1' to abort the operation: Populate table - + Tabelle füllen Database - + Datenbank Table - + Tabelle Columns - + Spalten Number of rows to populate: - + Anzahl an Datenzeilen zum Auffüllen: Populate populate dialog button - + Füllen Abort - + Abbrechen Configure - + Konfigurieren Populating configuration for this column is invalid or incomplete. - + Die Konfigurationsauffüllung für diese Spalte ist ungültig oder unvollständig. Select database with table to populate - + Wählen Sie die Datebank und Tabelle zum Auffüllen aus. Select table to populate - + Wählen Sie die Tabelle zum Auffüllen aus. You have to select at least one column. - + Sie müssen mindestens eine Spalte auswählen. @@ -4012,42 +4027,42 @@ Please enter new, unique name, or press '%1' to abort the operation: Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + Spalten, die das Ergebnis von verbundenen %1 Abfragen sind (solche, die %2, %3 oder %4 Schlüsselwörter enthalten), können nicht editiert werden. The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Der Ausführungsmechanismus hat Probleme die ROWID korrekt zu extrahieren. Dies könnte ein Programmfehler sein, den Sie evtl. melden möchten. Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Die betreffende Spalte ist das Ergebnis eines SQL-Ausdrucks statt einer einfachen Spaltenselektion. Solche Spalten können nicht editiert werden. Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Die betreffende Spalte gehört zu einer eingeschränkten SQLite Tabelle. Solche Tabellen können nicht direkt editiert werden. Cannot edit results of query other than %1. - + Es können keine Ergebnisse von einer von %1 abweichenden Abfrage editiert werden. Cannot edit columns that are result of aggregated %1 statements. - + Es können keine Spalten editiert werden, die das Ergebnis einer aggregierten %1 Abfrage sind. Cannot edit columns that are result of %1 statement. - + Es können keine Spalten editiert werden, die das Ergebnis von %1 Abfragen sind. Cannot edit columns that are result of common table expression statement (%1). - + Es können keine Spalten editiert werden, die das Ergebnis von allgemeinen Tabellenausdrücken sind (%1). @@ -4056,558 +4071,560 @@ Please enter new, unique name, or press '%1' to abort the operation: on conflict: %1 data view tooltip - + Bei Konfikt: %1 references table %1, column %2 data view tooltip - + Referenztabelle %1, Zeile %2 condition: %1 data view tooltip - + Zustand: %1 collation name: %1 data view tooltip - + Name der Kollation: %1 Data grid view - + Ergebnisansicht Copy cell(s) contents to clipboard - + Kopiert Zelleninhalt(e) in die Zwischenablage Paste cell(s) contents from clipboard - + Fügt Zelleninhalt(e) von der Zwischenablage ein Set empty value to selected cell(s) - + Fügt einen leeren Wert in die selektierte(n) Zelle(n) ein Set NULL value to selected cell(s) - + Fügt den NULL Wert in die selektierte(n) Zelle(n) ein Commit changes to cell(s) contents - + Änderungen der Zellenninhalte speichern Rollback changes to cell(s) contents - + Änderungen der Zelleninhalte zurücknehmen Delete selected data row - + Markierte Datenzeile löschen Insert new data row - + Neue Datenzeile einfügen Open contents of selected cell in a separate editor - + Inhalt der markierten Zelle im separaten Editor öffnen Total pages available: %1 - + Verfügbare Gesamtseiten: %1 Total rows loaded: %1 - + Insgesamt geladene Zeilen: %1 Data view (both grid and form) - + Ergebnisansicht (tabellarisch und Formular) Refresh data - + Daten aktualisieren Switch to grid view of the data - + Zur tabellarischen Ergebnisansicht wechseln Switch to form view of the data - + Zur Formularansicht wechseln Database list - + Liste der Datenbanken Delete selected item - + Gewählten Eintrag löschen Clear filter contents - + Filter zurücksetzen Refresh schema - + Schema aktualisieren Refresh all schemas - + Alle Schemas aktualisieren Add database - + Datenbank hinzufügen Select all items - + Alles auswählen Copy selected item(s) - + Gewählte Einträge kopieren Paste from clipboard - + Von der Zwischenablage einfügen Tables - + Tabellen Indexes - + Indizes Triggers - + Trigger Views - + Views Columns - + Spalten Data form view - + Formularansicht der Ergebnisse Commit changes for current row - + Änderungen der aktuellen Zeile speichern Rollback changes for current row - + Änderungen der aktuellen Zeile zurücknehmen Go to first row on current page - + Springe zur ersten Zeile dieser Seite Go to next row - + Springe zur nächsten Zeile Go to previous row - + Springe zur vorherigen Zeile Go to last row on current page - + Springe zur letzten Zeile dieser Seite Insert new row - + Neue Zeile einfügen Delete current row - + Derzeitige Zeile löschen Main window - + Hauptfenster Open SQL editor - + SQL Editor öffnen Previous window - + Vorheriges Fenster Next window - + Nächstes Fenster Hide status area - + Statusfeld verbergen Open configuration dialog - + Konfigurationsdialog öffnen Open Debug Console - + Debug Konsole öffnen Open CSS Console - + CSS Konsole öffnen Cell text value editor - + Editor für Textwerte in Zellen Cut selected text - + Gewählten Text ausschneiden Copy selected text - + Gewählten Text kopieren Delete selected text - + Gewählten Text löschen Undo - + Rückgängig Redo - + Wiederholen SQL editor input field - + SQL Editor Eingabefeld Select whole editor contents - + Gesamten Editorinhalt auswählen Save contents into a file - + Inhalte in eine Datei speichern Load contents from a file - + Inhalte aus einer Datei laden Find in text - + Suche im Text Find next - + Nächster Fund Find previous - + Vorheriger Fund Replace in text - + Ersetze im Text Delete current line - + Aktuelle Zeile löschen Request code assistant - + Code-Assistenten anfordern Format contents - + Format-Inhalte Move selected block of text one line down - + Selektierten Textblock eine Zeile nach unten verschieben Move selected block of text one line up - + Selektierten Textblock eine Zeile nach oben verschieben Copy selected block of text and paste it a line below - + Selektierten Textblock kopieren und unterhalb einfügen Copy selected block of text and paste it a line above - + Selektierten Textblock kopieren und oberhalb einfügen All SQLite databases - + Alle SQLite Datenbanken All files - + Alle Dateien Database file - + Datenbankdatei Reports history window - + Diese Übersetzung muss noch einmal geprüft werden, wenn ich den Kontext dazu kenne. + Report-Verlaufsfenster Delete selected entry - + Gewählten Eintrag löschen SQL editor window - + SQL Editor-Fenster Execute query - + Abfrage ausführen Execute "%1" query - + Abfrage "%1" ausführen Switch current working database to previous on the list - + Wechsel von der aktuellen Datenbank zur vorherigen in der Liste Switch current working database to next on the list - + Wechsel von der aktuellen Datenbank zur nächsten in der Liste Go to next editor tab - + Gehe zum nächsten Editor-Reiter Go to previous editor tab - + Gehe zum vorherigen Editor-Reiter Move keyboard input focus to the results view below - + Tastatureingabe-Fokus in das untere Ergebnisfenster setzen Move keyboard input focus to the SQL editor above - + Tastatureingabe-Fokus in das obere SQL Editorfenster setzen Table window - + Tabellenfenster Refresh table structure - + Aktualisiere Tabellenstruktur Add new column - + Neue Spalte zufügen Edit selected column - + Gewählte Spalte bearbeiten Delete selected column - + Gewählte Spalte löschen Export table data - + Tabellendaten exportieren Import data to the table - + Daten in die Tabelle importieren Add new table constraint - + Neue Tabellenbedingung zufügen Edit selected table constraint - + Markierte Tabellenbedingung bearbeiten Delete selected table constraint - + Markierte Tabellenbedingung löschen Refresh table index list - + Aktualisiere Tabellenindexliste Add new index - + Neuen Index zufügen Edit selected index - + Gewählten Index bearbeiten Delete selected index - + Gewählten Index löschen Refresh table trigger list - + Aktualisiere Tabellentriggerliste Add new trigger - + Neuen Trigger zufügen Edit selected trigger - + Gewählten Trigger bearbeiten Delete selected trigger - + Gewählten Trigger löschen Go to next tab - + Springe zum nächsten Reiter Go to previous tab - + Springe zum vorherigen Reiter A view window - + Neues Fenster zufügen Refresh view trigger list - + Ggf. View mit Ansicht übersetzen, muss im Kontext geklärt werden + Aktualisiere View Triggerliste @@ -4615,14 +4632,16 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommited changes - + Nicht gespeicherte Änderungen Are you sure you want to quit the application? Following items are pending: - + Sind Sie sicher, dass Sie das Programm beenden wollen? + +Folgende Punkte sind unerledigt: @@ -4630,48 +4649,49 @@ Following items are pending: Find or replace - + Ggf. Suchen statt Finden? + Finden oder Ersetzen Find: - + Finden: Case sensitive - + Groß- und Kleinschreibung beachten Search backwards - + Suche rückwärts Regular expression matching - + Prüfung nach regulärem Ausdruck Replace && find next - + Ersetzen && weitersuchen Replace with: - + Ersetzen mit: Replace all - + Alles ersetzen Find - + Finden @@ -4679,34 +4699,34 @@ find next Sort by columns - + Nach Spalten sortiert Column - + Spalte Order - + Sortierung Sort by: %1 - + Sortiert nach: %1 Move column up - + Spalte nach oben verschieben Move column down - + Spalte nach unten verschieben @@ -4715,172 +4735,173 @@ find next Cut sql editor - + Ausschneiden Copy sql editor - + Kopieren Paste sql editor - + Einfügen Delete sql editor - + Löschen Select all sql editor - + Alles auswählen Undo sql editor - + Rückgängig Redo sql editor - + Wiederholen Complete sql editor - + Komplett Format SQL sql editor - + SQL formatieren Save SQL to file sql editor - + SQL in Datei speichern Select file to save SQL sql editor - + SQL aus Datei laden Load SQL from file sql editor - + Zeile löschen Delete line sql editor - + Zeile löschen Move block down sql editor - + Block nach unten verschieben Move block up sql editor - + Block nach oben verschieben Copy block down sql editor - + Block nach unten kopieren Copy up down sql editor - + "up down" ??? Muss geklärt werden! + Kopiere auf ab Find sql editor - + Finden Find next sql editor - + Nächster Fund Find previous sql editor - + Vorheriger Fund Replace sql editor - + Ersetzen Saved SQL contents to file: %1 - + SQL Inhalte in Datei speichern: %1 Syntax completion can be used only when a valid database is set for the SQL editor. - + Die Funktion Autovervollständigung kann nur genutzt werden, wenn eine gültige Datenbank für den SQL Editor gewählt wurde. Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Der Text im SQL Editor ist sehr groß, daher wurde die Syntaxkontrolle und die farbliche Hervorhebung von Objekten vorübergehend deaktiviert. Save to file - + In Datei speichern Could not open file '%1' for writing: %2 - + Die Datei '%1' kann nicht für Schreibzugriffe geöffnet werden: %2 SQL scripts (*.sql);;All files (*) - + SQL Skripte (*.sql);;Alle Dateien (*) Open file - + Datei öffnen Could not open file '%1' for reading: %2 - + Die Datei '%1' kann nicht für Lesezugriffe geöffnet werden: %2 Reached the end of document. Hit the find again to restart the search. - + Das Dokumentenende wurde erreicht. Drücken Sie 'Nächster Fund', um die Suche am Dokumentenanfang fortzusetzen. @@ -4889,35 +4910,35 @@ find next Column: data view tooltip - + Spalte: Data type: data view - + Datentyp: Table: data view tooltip - + Tabelle: Constraints: data view tooltip - + Bedingungen: This cell is not editable, because: %1 - + Diese Zelle kann nicht editiert werden, weil: %1 Cannot load the data for a cell that refers to the already closed database. - + Es können keine Daten für eine Zelle dargestellt werden, die eine bereits geschlossene Datenbank referenziert. @@ -4926,12 +4947,12 @@ find next Cannot edit this cell. Details: %2 - + Die Zelle kann nicht editiert. Details: %2 The row is marked for deletion. - + Diese Zeile ist zum Löschen markiert. @@ -4940,68 +4961,68 @@ find next Only one query can be executed simultaneously. - + Es kann nur eine Abfrage gleichzeitig ausgeführt werden. Uncommited data - + Nicht gespeicherte Daten There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Es gibt ungespeicherte Änderungen. Möchten Sie wirklich fortfahren? Alle Änderungen werden dann verloren gehen. Cannot commit the data for a cell that refers to the already closed database. - + Es können keine Daten für eine Zelle gespeichert werden, die eine bereits geschlossene Datenbank referenziert. Could not begin transaction on the database. Details: %1 - + Es kann keine Transaktion auf der Datenbank gestartet werden. Details: %1 An error occurred while commiting the transaction: %1 - + Fehler beim Committen der Transaktion: %1 An error occurred while rolling back the transaction: %1 - + Fehler beim Rollback der Transaktion: %1 Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Es wurde versucht eine nicht editierbare Zelle zu committen (derzeit modifiziert und auf das Commit wartend)! Dies ist ein Fehler den Sie melden sollten. An error occurred while commiting the data: %1 - + Fehler beim Committen der Daten: %1 Error while executing SQL query on database '%1': %2 - + Fehler beim Ausführen der SQL-Abfrage auf der Datenbank '%1': %2 Error while loading query results: %1 - + Fehler beim Laden der Abfrageergebnisse: %1 Insert multiple rows - + Mehrere Zeilen einfügen Number of rows to insert: - + Anzahl an Zeilen zum Einfügen: @@ -5009,92 +5030,92 @@ find next Copy - + Kopieren Copy as... - + Kopieren als... Paste - + Einfügen Paste as... - + Einfügen als... Set NULL values - + NULL Wert setzen Erase values - + Werte löschen Edit value in editor - + Wert im Editor bearbeiten Commit - + Commit Rollback - + Rollback Commit selected cells - + Gewählte Zellen speichern Rollback selected cells - + Gewählte Zellen wiederherstellen Define columns to sort by - + Sortierspalten definieren Remove custom sorting - + Benutzerdefinierte Sortierung entfernen Insert row - + Zeile einfügen Insert multiple rows - + Mehrere Zeilen einfügen Delete selected row - + Gewählte Zeile löschen No items selected to paste clipboard contents to. - + Es sind keine Elemente selektiert in die der Inhalt der Zwischenablage eingefügt werden könnte. Edit value - + Werte editieren @@ -5102,12 +5123,12 @@ find next Error while commiting new row: %1 - + Fehler beim Committen der neuen Zeile: %1 Error while deleting row from table %1: %2 - + Fehler beim Löschen der Zeile aus Tabelle %1: %2 @@ -5115,17 +5136,17 @@ find next Status - + Status Copy - + Kopieren Clear - + Leeren @@ -5300,19 +5321,19 @@ but it's okay to use them anyway. Name table structure columns - + Name Data type table structure columns - + Datentyp Default value table structure columns - + Standardwert diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts index 87e68ab..78940e4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts @@ -888,7 +888,7 @@ but it's okay to use it. ConfigDialog - + Configuration @@ -969,449 +969,476 @@ but it's okay to use it. - + + Inserting new row in data grid + + + + + Before currently selected row + + + + + + + General.InsertRowPlacement + + + + + After currently selected row + + + + + At the end of data view + + + + Data types - + Available editors: - + Editors selected for this data type: - + Schema editing - + Number of DDL changes kept in history. - + DDL history size: - + Don't show DDL preview dialog when commiting schema changes - + SQL queries - - + + Number of queries kept in the history. - + History size: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + Execute only the query under the cursor - + Updates - + Automatically check for updates at startup - + Session - + Restore last session (active MDI windows) after startup - + Filter shortcuts by name or key combination - + Action - + Key combination - - + + Language - + Changing language requires application restart to take effect. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout - + General.CompactLayout - + Database list - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. - + Sort table columns alphabetically - + Expand tables node when connected to a database - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> - + Display additional labels on the list - + For regular tables labels will show number of columns, indexes and triggers for each of tables. - + Display labels for regular tables - + Virtual tables will be marked with a 'virtual' label. - + Display labels for virtual tables - + Expand views node when connected to a database - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) - + Sort objects (tables, indexes, triggers and views) alphabetically - + Display system tables and indexes on the list - + Table windows - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. - + Open Table Windows with the data tab for start - + View windows - + When enabled, View Windows will show up with the data tab, instead of the structure tab. - + Open View Windows with the data tab for start - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + Preview - + Enabled - + Disabled - + Active formatter plugin - + SQL editor font - + Database list font - + Database list additional label font - + Data view font - + Status field font - + SQL editor colors - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - + Uncommited data outline color - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground - + Deleted row background - + Database list colors - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground - + Warning message foreground - + Error message foreground @@ -1673,97 +1700,115 @@ but it's okay to use it. - + First page data view - + Previous page data view - + Next page data view - + Last page data view - + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 @@ -1910,7 +1955,7 @@ Browsing other pages will be possible after the row counting is done. - + File @@ -1931,47 +1976,47 @@ Browsing other pages will be possible after the row counting is done. - + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - + Auto-generated - + Type the name @@ -3226,42 +3271,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3352,19 +3397,19 @@ Please enter new, unique name, or press '%1' to abort the operation: - - + + Error index dialog - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? - + An error occurred while executing SQL statements: %1 @@ -3436,248 +3481,248 @@ Please enter new, unique name, or press '%1' to abort the operation: - + You need to restart application to make the language change take effect. - + Open SQL editor - + Open DDL history - + Open SQL functions editor - + Open collations editor - + Import - + Export - + Open configuration dialog - + Tile windows - + Tile windows horizontally - + Tile windows vertically - + Cascade windows - + Next window - + Previous window - + Hide status field - + Close selected window - + Close all windows but selected - + Close all windows - + Restore recently closed window - + Rename selected window - + Open Debug Console - + Open CSS Console - + Report a bug - + Propose a new feature - + About - + Licenses - + Open home page - + Open forum page - + User Manual - + SQLite documentation - + Report history - + Check for updates - + Database menubar - + Structure menubar - + View menubar - + Window list menubar view menu - + Tools menubar - + Help - + Could not set style: %1 main window - + Cannot export, because no export plugin is loaded. - + Cannot import, because no import plugin is loaded. - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -4127,12 +4172,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Total pages available: %1 - + Total rows loaded: %1 @@ -4199,7 +4244,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Paste from clipboard @@ -4320,106 +4365,106 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next - + Find previous - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above @@ -4712,173 +4757,173 @@ find next SqlEditor - + Cut sql editor - + Copy sql editor - + Paste sql editor - + Delete sql editor - + Select all sql editor - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor - + Save SQL to file sql editor - + Select file to save SQL sql editor - + Load SQL from file sql editor - + Delete line sql editor - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor - + Find next sql editor - + Find previous sql editor - + Replace sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) - + Open file - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. @@ -4994,12 +5039,12 @@ find next - + Insert multiple rows - + Number of rows to insert: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts index 08d39fc..6ecc9aa 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts @@ -890,7 +890,7 @@ mais c'est OK pour l'utiliser. ConfigDialog - + Configuration Configuration @@ -971,449 +971,476 @@ mais c'est OK pour l'utiliser. Lilite initial de la largeur de la colonne de données (en pixel): - + + Inserting new row in data grid + + + + + Before currently selected row + + + + + + + General.InsertRowPlacement + + + + + After currently selected row + + + + + At the end of data view + + + + Data types Types de données - + Available editors: Editeurs disponibles: - + Editors selected for this data type: Editeur sélectionné pour ce type de données: - + Schema editing Edition de schéma - + Number of DDL changes kept in history. Nombre de DDL modifiés gardés dans l'historique. - + DDL history size: Dimension de l'historique DDL: - + Don't show DDL preview dialog when commiting schema changes Ne pas montrer la présualisation DDL pendant l'enregistrement de schéma modifié - + SQL queries Requêtes SQL - - + + Number of queries kept in the history. Nombre de requêtes gardées dans l'historique. - + History size: Dimension de l'historique: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>S'il y a plus d'une requête dans l'éditeur d'SQL, alors (si cette option est permise) seulement une seule requête sera exécutée -cellesous le curseur d'insertion. Autrement toutes les requêtes seront exécutées. Vous pouvez limiter le nombre de requêtes devant être exécutées en sélectionnant ces requêtes avant leur exécution.</p> - + Execute only the query under the cursor Exécuter seulement la requête sous le curseur - + Updates Mises à jour - + Automatically check for updates at startup Contrôle automatique des mises à jour au lancement - + Session Session - + Restore last session (active MDI windows) after startup Restaurer la dernière session(Fenêtre MDI active) après lancement - + Filter shortcuts by name or key combination Filtre par nom raccourci ou combinaison de touches - + Action Action - + Key combination Combinaison de touches - - + + Language Langage - + Changing language requires application restart to take effect. Le changement de langage requiére le redemarrage de l'application pour prendre effet. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout - + General.CompactLayout - + Database list Liste de base de données - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. Sur off, les colonnes seront triées dans l'ordre de saisie de l'instruction CREATE TABLE. - + Sort table columns alphabetically Ordre de tri alpha de la colonne - + Expand tables node when connected to a database Déployez le noeud des tables lors de la connexion de la base de données - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> <p>Les labels supplémentaires sont ceux montrés à côté des noms dans la liste de bases de données ( bleus,sauf autre configaration). Permettre cette option aboutira aux lablels pour des bases de données, des bases de données invalides et des noeuds (colonnes, index, déclancheur). Pour plus de labels voir des options ci-dessous.<p> - + Display additional labels on the list Afficher des labels supplémentairesà la liste - + For regular tables labels will show number of columns, indexes and triggers for each of tables. Pour des tables courantes les labels montrerons le nombre der colonnes, index et déclencheurs pour chaque tables. - + Display labels for regular tables Afficher les labels pour les tables courantes - + Virtual tables will be marked with a 'virtual' label. Les tables vituelles seront marquées avec un label virtuel. - + Display labels for virtual tables Afficher les labels pour les tables virtuelles - + Expand views node when connected to a database Etendre le noeud des vues lorsque la base de données est connectée - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) Si cette option est déactivée, les objets seront triés pour qu' ils apparaissent dans la table sqlite_master (dans l'ordre de création) - + Sort objects (tables, indexes, triggers and views) alphabetically Tri d'objets (tables, index, déclancheurs et vues) en alpha - + Display system tables and indexes on the list Afficher les tables système et index dans la liste - + Table windows Fenêtre de ta table - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. Lorsque c'est permis, la fenêtre des tables sera affichée avec l'onglet des données, à la place de l'onglet structure. - + Open Table Windows with the data tab for start Ourerture la fenêtre de table avec l'onglet des données au départ - + View windows Fenêtre de vue - + When enabled, View Windows will show up with the data tab, instead of the structure tab. Lorsque c'est permis, la fenêtre des vues sera affichée avec l'onglet des données, à la place de l'onglet structure. - + Open View Windows with the data tab for start Ourerture la fenêtre de vue avec l'onglet des données au départ - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins Cacher des plugins incorporés - + Current style: Style actuel: - + Preview Aperçu - + Enabled En service - + Disabled Hors service - + Active formatter plugin Plugin de formattage actf - + SQL editor font Police de l'éditeur SQL - + Database list font Liste des polices de base de données - + Database list additional label font Police additionel de la liste des base de données - + Data view font Police des données de vue - + Status field font Police du champ status - + SQL editor colors Couleurs de l'éditeur SQL - + Current line background Fond actuel de la ligne - + <p>SQL strings are enclosed with single quote characters.</p> <p>Les chaines SQL sont encadrées avec de caractères simple quote.</p> - + String foreground Avant plan chaine - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <p>Les paramètres fournis par l'utilisateur sont passés par valeur. Ils ont l'une de ces formes:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground Premier plan de paramètre de lien - + Highlighted parenthesis background Parenthèses surlignées - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>les valeurs BLOB sont binaire représentés comme nombres hexadécimaux, comme:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground Premier plan de valeur BLOB - + Regular foreground Avant plan courant - + Line numbers area background Zone des numéros de ligne en arrière plan - + Keyword foreground Mot clé en avant plan - + Number foreground Nombre en avant plan - + Comment foreground Commentaire en avant plan - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Les objets valides sont les nom de tables, index, déclencheurs, ou vues qui existent dans la base de données SQLite.</p> - + Valid objects foreground Objets valides en avant plan - + Data view colors Couleurs de vue de données - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> <p>Touts les modifications de données seront écrits avec cette couleur,à l'enregistrement de la base de données.</p> - + Uncommited data outline color Annulation de la couleur des données - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> <p>En cas de l'erreur à l'enregistrement des modifications de données, la cellule problématique sera indiquée avec cette couleur.</p> - + Commit error outline color Erreur d'enregistrement du surlignage - + NULL value foreground Valeur NULL au premier plan - + Deleted row background Ligne supprimée en arrier plan - + Database list colors Liste de couleurs des bases de données - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Des labels supplémentaires indique la version SQLITE, le nombre d'objets au nieau inférieur, etc.</p> - + Additional labels foreground Labels additionels en avant plan - + Status field colors Couleurs du status des champs - + Information message foreground Message d'information devant - + Warning message foreground Warning devant - + Error message foreground Message d'erreur devant @@ -1675,97 +1702,115 @@ mais c'est OK pour l'utiliser. Actualiser les données de la table - + First page data view Première page - + Previous page data view Page précédente - + Next page data view Page suivante - + Last page data view Dernière page - + Apply filter data view Appliquer le filtre - + Commit changes for selected cells data view Enregistrer les modifications des cellules sélectionnées - + Rollback changes for selected cells data view Annuler les modifications des celulles sélectionnées - + Show grid view of results sql editor Afficache des résultats en tableau - + Show form view of results sql editor Affichage des résultat en formulaire - + Filter by text data view Filtrer par texte - + Filter by the Regular Expression data view Filtrer par une expression standard - + Filter by SQL expression data view Filtrer par une expression SQL - + Tabs on top data view Onglets en haut - + Tabs at bottom data view Onglet en bas - + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Le total des lignes en cours de comptage. La navigation d'autres pages à la fin du comptage. - + Row: %1 Lignes: %1 @@ -1924,7 +1969,7 @@ Browsing other pages will be possible after the row counting is done. - + File Fichier @@ -1953,42 +1998,42 @@ Browsing other pages will be possible after the row counting is done. Test de connexion - + Browse for existing database file on local computer - + Browse Navigateur - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - + Auto-generated @@ -1997,7 +2042,7 @@ Browsing other pages will be possible after the row counting is done. Le non sera généré automatiquement - + Type the name Saississez le nom @@ -3262,42 +3307,42 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Optrions de source de données - + Cancel Annuler - + If you type table name that doesn't exist, it will be created. Si vous saississez un nom de table inexistant, celle-ci sera créée. - + Enter the table name Saississez un nom de table - + Select import plugin. Sélectionnez un plugin d'importation. - + You must provide a file to import from. Vous devez fournir un fichier à importer. - + The file '%1' does not exist. Le fichier '%1' n'existe pas. - + Path you provided is a directory. A regular file is required. Le chemin indiqué est un répertoire. Un fichier est requis. - + Pick file to import from Sélectionnez le fichier d'importation @@ -3388,19 +3433,19 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro ordre de tri - - + + Error index dialog Erreur - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? Impossible de créer un index, car les valeurs des colonnes sélectionnées ne sont pas uniques. Voulez-vous exécuter une requête SELECT pour voir les valeurs problématiques? - + An error occurred while executing SQL statements: %1 Une erreur survenue à l'exécution de l'SQL: @@ -3473,248 +3518,248 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Passage en mode débogue. Les messages de débogage sont imprimés dans la sortie standard. - + You need to restart application to make the language change take effect. Vous devez relancer l'application pour que le langage prenne effet. - + Open SQL editor Ouvrir éditeur SQL - + Open DDL history Ouvrir Historique DDL - + Open SQL functions editor Editeur de fonctions SQL - + Open collations editor Ouvrir editeur de collections - + Import Importer - + Export Exporter - + Open configuration dialog Ouvrir dialogue de configuration - + Tile windows Organisation des fenêtres - + Tile windows horizontally Organisation des fenêtres horizontalement - + Tile windows vertically Organisation des fenêtres verticalement - + Cascade windows Organisation des fenêtres en cascade - + Next window Fenêtre suivante - + Previous window Fenêtre précédante - + Hide status field Ca - + Close selected window Fermeture fenêtre sélectionnée - + Close all windows but selected Fermeture de toutes les fenêtres sélectionnées - + Close all windows Fermeture de toutes les fenêtres - + Restore recently closed window Restaure une fenêtre récemment fermée - + Rename selected window Renomme la fenêtre sélectionnée - + Open Debug Console Ouvrir la console de debogage - + Open CSS Console - + Report a bug Rapport de bug - + Propose a new feature Proposer une nouvelle fonction - + About Apropos - + Licenses Licences - + Open home page Ouvrir la home page - + Open forum page Ouvrir la page des forums - + User Manual Manuel utilisateurs - + SQLite documentation Documentation SQLite - + Report history Raport d'historique - + Check for updates Vérification de mises à jour - + Database menubar Base de données - + Structure menubar Structure - + View menubar Vue - + Window list menubar view menu Liste de fenêtres - + Tools menubar Outils - + Help Aide - + Could not set style: %1 main window Impossible de positionner le style: %1 - + Cannot export, because no export plugin is loaded. Exportation impossible, aucun plugin d'exportation n'est chargé. - + Cannot import, because no import plugin is loaded. Importation impossible, aucun plugin d'importation n'est chargé. - + Rename window Renommer la fenêtre - + Enter new name for the window: Saississez un nouveau nom de fenêtre: - + New updates are available. <a href="%1">Click here for details</a>. Une nouvelle mise à jour est disponible. <a href="%1"> cliquez ici pour détails</a>. - + You're running the most recent version. No updates are available. Vous utilisez la dernière version. Aucune mise à jour de disponible. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 La base de données passée en paramètre dans la ligne de commande (%1)a été temporaire ajoutée à la liste sous le nom: %2 - + Could not add database %1 to list. Impossible d'ajouter la base de données %1 à la liste. @@ -4164,12 +4209,12 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Contenu ouvert de cellule choisie dans un éditeur séparé - + Total pages available: %1 Total de pages: %1 - + Total rows loaded: %1 Total dee lignes chargées: %1 @@ -4236,7 +4281,7 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro - + Paste from clipboard Collé dans le presse-papier @@ -4357,106 +4402,106 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro - + Cut selected text Couper le texte sélectionné - + Copy selected text Copie du texte sélectionné - + Delete selected text Suppression du texte sélectionné - + Undo Défaire - + Redo Refaire - + SQL editor input field Editeur SQL saisie de champ - + Select whole editor contents Sélectionnez le contenu entier de l'éditeur - + Save contents into a file Sauver le contenu dans un fichier - + Load contents from a file Charger le contenu d'un fichier - + Find in text Rechercher un texte - + Find next Recherche suivante - + Find previous Recherche précédente - + Replace in text Remplacer dans le texte - + Delete current line Supprimer la ligne courante - + Request code assistant Assistant de code nécessaire - + Format contents Format de contenu - + Move selected block of text one line down Déplacer le block de texte sélectionné à la ligne inférieure - + Move selected block of text one line up Déplacer le block de texte sélectionné à la ligne supérieure - + Copy selected block of text and paste it a line below Copier le block de texte sélectionné à la ligne au dessus - + Copy selected block of text and paste it a line above Copier le block de texte sélectionné à la ligne au dessous @@ -4750,173 +4795,173 @@ recherche suivant SqlEditor - + Cut sql editor Couper - + Copy sql editor Copier - + Paste sql editor Coller - + Delete sql editor Supprimer - + Select all sql editor Tout sélectionner - + Undo sql editor Défaire - + Redo sql editor Refaire - + Complete sql editor Complet - + Format SQL sql editor Format SQL - + Save SQL to file sql editor Enregistrer le SQL - + Select file to save SQL sql editor - + Load SQL from file sql editor Charger le SQL - + Delete line sql editor Ligne suppimée - + Move block down sql editor Descendre le block - + Move block up sql editor Monter le block - + Copy block down sql editor Copier block au-dessus - + Copy up down sql editor Copier block au-dessous - + Find sql editor Chercher - + Find next sql editor Chercher suivant - + Find previous sql editor Chercher précédent - + Replace sql editor Remplacer - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. L'achèvement de syntaxe peut être utilisé seulement quand une base de données valable est utilisée dans l'éditeur SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Le contenu l'éditeur SQL est important, aussi la détectiond'objets en erreur est temporairement mise hors de service. - + Save to file Sauvegarder - + Could not open file '%1' for writing: %2 Impossible d'ouvrir en écriture le fichier '%1': %2 - + SQL scripts (*.sql);;All files (*) Scripts SQL (*.sql);;tous fichiers (*) - + Open file Fichier ouvert - + Could not open file '%1' for reading: %2 Impossible d'ouvrir en lecture le fichier '%1': %2 - + Reached the end of document. Hit the find again to restart the search. Fin de document atteint. Saississez de nouveau la recherche pour relancer la recherche. @@ -5032,12 +5077,12 @@ recherche suivant Erreur lors du chargement des résultats de la requête: %1 - + Insert multiple rows Insérer plusieurs lignes - + Number of rows to insert: Nombre de lignes à inserrer: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts new file mode 100644 index 0000000..16fc700 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts @@ -0,0 +1,6154 @@ + + + + + AboutDialog + + + About SQLiteStudio and licenses + + + + + About + + + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + + + + + Licenses + + + + + Environment + + + + + Icon directories + + + + + Form directories + + + + + Plugin directories + + + + + Configuration directory + + + + + Application directory + + + + + Qt version: + + + + + SQLite 3 version: + + + + + Portable distribution. + + + + + MacOS X application boundle distribution. + + + + + Operating system managed distribution. + + + + + Copy + + + + + <h3>Table of contents:</h3><ol>%2</ol> + + + + + BugDialog + + + Bugs and ideas + + + + + Reporter + + + + + E-mail address + + + + + + Log in + + + + + Short description + + + + + Detailed description + + + + + Show more details + + + + + SQLiteStudio version + + + + + Operating system + + + + + Loaded plugins + + + + + Send + + + + + You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. + + + + + A bug report sent successfully. + + + + + An error occurred while sending a bug report: %1 +%2 + + + + + + You can retry sending. The contents will be restored when you open a report dialog after an error like this. + + + + + An idea proposal sent successfully. + + + + + An error occurred while sending an idea proposal: %1 +%2 + + + + + A bug report + + + + + Describe problem in few words + + + + + Describe problem and how to reproduce it + + + + + A new feature idea + + + + + A title for your idea + + + + + Describe your idea in more details + + + + + Reporting as an unregistered user, using e-mail address. + + + + + Reporting as a registered user. + + + + + Log out + + + + + Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. + + + + + Enter vaild e-mail address, or log in. + + + + + Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. + + + + + Long description requires at least 30 characters. + + + + + BugReportHistoryWindow + + + + Title + + + + + + Reported at + + + + + + URL + + + + + Reports history + + + + + Clear reports history + + + + + Delete selected entry + + + + + Invalid response from server. + + + + + BugReportLoginDialog + + + Log in + + + + + Credentials + + + + + Login: + + + + + Password: + + + + + Validation + + + + + Validate + + + + + Validation result message + + + + + Abort + + + + + A login must be at least 2 characters long. + + + + + A password must be at least 5 characters long. + + + + + Valid + + + + + CollationsEditor + + + Filter collations + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Implementation code: + + + + + Collation name: + + + + + Implementation language: + + + + + Collations editor + + + + + Commit all collation changes + + + + + Rollback all collation changes + + + + + Create new collation + + + + + Delete selected collation + + + + + Editing collations manual + + + + + Enter a non-empty, unique name of the collation. + + + + + Pick the implementation language. + + + + + Enter a non-empty implementation code. + + + + + Collations editor window has uncommited modifications. + + + + + ColorButton + + + Pick a color + + + + + ColumnCollatePanel + + + Collation name: + + + + + Named constraint: + + + + + Enter a name of the constraint. + + + + + Enter a collation name. + + + + + ColumnDefaultPanel + + + Default value: + + + + + Named constraint: + + + + + Enter a default value expression. + + + + + Invalid default value expression: %1 + + + + + Enter a name of the constraint. + + + + + ColumnDialog + + + Column + + + + + Name and type + + + + + Scale + + + + + Precision + + + + + Data type: + + + + + Column name: + + + + + Size: + + + + + Constraints + + + + + Unique + + + + + + + + + + + Configure + + + + + Foreign Key + + + + + Collate + + + + + Not NULL + + + + + Check condition + + + + + Primary Key + + + + + Default + + + + + Advanced mode + + + + + Add constraint + column dialog + + + + + Edit constraint + column dialog + + + + + + Delete constraint + column dialog + + + + + Move constraint up + column dialog + + + + + Move constraint down + column dialog + + + + + Add a primary key + column dialog + + + + + Add a foreign key + column dialog + + + + + Add an unique constraint + column dialog + + + + + Add a check constraint + column dialog + + + + + Add a not null constraint + column dialog + + + + + Add a collate constraint + column dialog + + + + + Add a default constraint + column dialog + + + + + Are you sure you want to delete constraint '%1'? + column dialog + + + + + Correct the constraint's configuration. + + + + + This constraint is not officially supported by SQLite 2, +but it's okay to use it. + + + + + ColumnDialogConstraintsModel + + + Type + column dialog constraints + + + + + Name + column dialog constraints + + + + + Details + column dialog constraints + + + + + ColumnForeignKeyPanel + + + Foreign table: + + + + + Foreign column: + + + + + Reactions + + + + + Deferred foreign key + + + + + Named constraint + + + + + Constraint name + + + + + Pick the foreign table. + + + + + Pick the foreign column. + + + + + Enter a name of the constraint. + + + + + ColumnPrimaryKeyPanel + + + Autoincrement + + + + + Sort order: + + + + + Named constraint: + + + + + On conflict: + + + + + Enter a name of the constraint. + + + + + Autoincrement (only for %1 type columns) + column primary key + + + + + ColumnUniqueAndNotNullPanel + + + Named constraint: + + + + + On conflict: + + + + + Enter a name of the constraint. + + + + + CompleterWindow + + + Column: %1 + completer statusbar + + + + + Table: %1 + completer statusbar + + + + + Index: %1 + completer statusbar + + + + + Trigger: %1 + completer statusbar + + + + + View: %1 + completer statusbar + + + + + Database: %1 + completer statusbar + + + + + Keyword: %1 + completer statusbar + + + + + Function: %1 + completer statusbar + + + + + Operator: %1 + completer statusbar + + + + + String + completer statusbar + + + + + Number + completer statusbar + + + + + Binary data + completer statusbar + + + + + Collation: %1 + completer statusbar + + + + + Pragma function: %1 + completer statusbar + + + + + ConfigDialog + + + + Configuration + + + + + Search + + + + + General + + + + + Keyboard shortcuts + + + + + Look & feel + + + + + Style + + + + + Fonts + + + + + Colors + + + + + Plugins + + + + + Code formatters + + + + + Data browsing + + + + + Data editors + + + + + Data browsing and editing + + + + + Number of data rows per page: + + + + + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> + + + + + Limit initial data column width to (in pixels): + + + + + Inserting new row in data grid + + + + + Before currently selected row + + + + + + + General.InsertRowPlacement + + + + + After currently selected row + + + + + At the end of data view + + + + + Data types + + + + + Available editors: + + + + + Editors selected for this data type: + + + + + Schema editing + + + + + Number of DDL changes kept in history. + + + + + DDL history size: + + + + + Don't show DDL preview dialog when commiting schema changes + + + + + SQL queries + + + + + + Number of queries kept in the history. + + + + + History size: + + + + + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> + + + + + Execute only the query under the cursor + + + + + Updates + + + + + Automatically check for updates at startup + + + + + Session + + + + + Restore last session (active MDI windows) after startup + + + + + Filter shortcuts by name or key combination + + + + + Action + + + + + Key combination + + + + + + Language + + + + + Changing language requires application restart to take effect. + + + + + Compact layout + + + + + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> + + + + + Use compact layout + + + + + General.CompactLayout + + + + + Database list + + + + + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. + + + + + Sort table columns alphabetically + + + + + Expand tables node when connected to a database + + + + + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> + + + + + Display additional labels on the list + + + + + For regular tables labels will show number of columns, indexes and triggers for each of tables. + + + + + Display labels for regular tables + + + + + Virtual tables will be marked with a 'virtual' label. + + + + + Display labels for virtual tables + + + + + Expand views node when connected to a database + + + + + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) + + + + + Sort objects (tables, indexes, triggers and views) alphabetically + + + + + Display system tables and indexes on the list + + + + + Table windows + + + + + When enabled, Table Windows will show up with the data tab, instead of the structure tab. + + + + + Open Table Windows with the data tab for start + + + + + View windows + + + + + When enabled, View Windows will show up with the data tab, instead of the structure tab. + + + + + Open View Windows with the data tab for start + + + + + Main window dock areas + + + + + Left and right areas occupy corners + + + + + Top and bottom areas occupy corners + + + + + Hide built-in plugins + + + + + Current style: + + + + + Preview + + + + + Enabled + + + + + Disabled + + + + + Active formatter plugin + + + + + SQL editor font + + + + + Database list font + + + + + Database list additional label font + + + + + Data view font + + + + + Status field font + + + + + SQL editor colors + + + + + Current line background + + + + + <p>SQL strings are enclosed with single quote characters.</p> + + + + + String foreground + + + + + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> + + + + + Bind parameter foreground + + + + + Highlighted parenthesis background + + + + + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> + + + + + BLOB value foreground + + + + + Regular foreground + + + + + Line numbers area background + + + + + Keyword foreground + + + + + Number foreground + + + + + Comment foreground + + + + + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> + + + + + Valid objects foreground + + + + + Data view colors + + + + + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> + + + + + Uncommited data outline color + + + + + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> + + + + + Commit error outline color + + + + + NULL value foreground + + + + + Deleted row background + + + + + Database list colors + + + + + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> + + + + + Additional labels foreground + + + + + Status field colors + + + + + Information message foreground + + + + + Warning message foreground + + + + + Error message foreground + + + + + Description: + plugin details + + + + + Category: + plugin details + + + + + Version: + plugin details + + + + + Author: + plugin details + + + + + Internal name: + plugin details + + + + + Dependencies: + plugin details + + + + + Conflicts: + plugin details + + + + + Plugin details + + + + + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. + + + + + %1 (built-in) + plugins manager in configuration dialog + + + + + Details + + + + + No plugins in this category. + + + + + Add new data type + + + + + Rename selected data type + + + + + Delete selected data type + + + + + Help for configuring data type editors + + + + + ConstraintCheckPanel + + + The condition + + + + + Named constraint: + + + + + On conflict + + + + + Enter a valid condition. + + + + + Enter a name of the constraint. + + + + + ConstraintDialog + + + New constraint + constraint dialog + + + + + Create + constraint dialog + + + + + Edit constraint + dialog window + + + + + Apply + constraint dialog + + + + + Primary key + table constraints + + + + + Foreign key + table constraints + + + + + Unique + table constraints + + + + + Not NULL + table constraints + + + + + Check + table constraints + + + + + Collate + table constraints + + + + + Default + table constraints + + + + + ConstraintTabModel + + + Table + table constraints + + + + + Column (%1) + table constraints + + + + + Scope + table constraints + + + + + Type + table constraints + + + + + Details + table constraints + + + + + Name + table constraints + + + + + CssDebugDialog + + + SQLiteStudio CSS console + + + + + DataView + + + Filter data + data view + + + + + Grid view + + + + + Form view + + + + + Refresh table data + data view + + + + + First page + data view + + + + + Previous page + data view + + + + + Next page + data view + + + + + Last page + data view + + + + + Apply filter + data view + + + + + Commit changes for selected cells + data view + + + + + Rollback changes for selected cells + data view + + + + + Show grid view of results + sql editor + + + + + Show form view of results + sql editor + + + + + Filter by text + data view + + + + + Filter by the Regular Expression + data view + + + + + Filter by SQL expression + data view + + + + + Tabs on top + data view + + + + + Tabs at bottom + data view + + + + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + + Total number of rows is being counted. +Browsing other pages will be possible after the row counting is done. + + + + + Row: %1 + + + + + DbConverterDialog + + + Convert database + + + + + Source database + + + + + Source database version: + + + + + Target database + + + + + Target version: + + + + + This is the file that will be created as a result of the conversion. + + + + + Target file: + + + + + Name of the new database: + + + + + This is the name that the converted database will be added to SQLiteStudio with. + + + + + Select source database + + + + + Enter valid and writable file path. + + + + + Entered file exists and will be overwritten. + + + + + Enter a not empty, unique name (as in the list of databases on the left). + + + + + No valid target dialect available. Conversion not possible. + + + + + Select valid target dialect. + + + + + Database %1 has been successfully converted and now is available under new name: %2 + + + + + SQL statements conversion + + + + + Following error occurred while converting SQL statements to the target SQLite version: + + + + + Would you like to ignore those errors and proceed? + + + + + DbDialog + + + Database + + + + + Database type + + + + + Database driver + + + + + + File + + + + + Create new database file + + + + + Name (on the list) + + + + + Generate name basing on file path + + + + + Generate automatically + + + + + Options + + + + + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> + aasfd + + + + + Permanent (keep it in configuration) + + + + + Test connection + + + + + Browse for existing database file on local computer + + + + + Browse + + + + + Enter an unique database name. + + + + + This name is already in use. Please enter unique name. + + + + + Enter a database file path. + + + + + This database is already on the list under name: %1 + + + + + Select a database type. + + + + + Auto-generated + + + + + Type the name + + + + + DbObjectDialogs + + + Delete table + + + + + Are you sure you want to delete table %1? + + + + + Delete index + + + + + Are you sure you want to delete index %1? + + + + + Delete trigger + + + + + Are you sure you want to delete trigger %1? + + + + + Delete view + + + + + Are you sure you want to delete view %1? + + + + + Error while dropping %1: %2 + + + + + DbTree + + + Databases + + + + + Filter by name + + + + + Copy + + + + + Paste + + + + + Select all + + + + + Create a group + + + + + Delete the group + + + + + Rename the group + + + + + Add a database + + + + + Edit the database + + + + + Remove the database + + + + + Connect to the database + + + + + Disconnect from the database + + + + + Import + + + + + Export the database + + + + + Convert database type + + + + + Vacuum + + + + + Integrity check + + + + + Create a table + + + + + Edit the table + + + + + Delete the table + + + + + Export the table + + + + + Import into the table + + + + + Populate table + + + + + Create similar table + + + + + Reset autoincrement sequence + + + + + Create an index + + + + + Edit the index + + + + + Delete the index + + + + + Create a trigger + + + + + Edit the trigger + + + + + Delete the trigger + + + + + Create a view + + + + + Edit the view + + + + + Delete the view + + + + + Add a column + + + + + Edit the column + + + + + Delete the column + + + + + Delete selected items + + + + + Clear filter + + + + + Refresh all database schemas + + + + + Refresh selected database schema + + + + + + Erase table data + + + + + + Database + + + + + Grouping + + + + + + Create group + + + + + Group name + + + + + Entry with name %1 already exists in group %2. + + + + + Delete group + + + + + Are you sure you want to delete group %1? +All objects from this group will be moved to parent group. + + + + + Delete database + + + + + Are you sure you want to delete database '%1'? + + + + + + Cannot import, because no import plugin is loaded. + + + + + + Cannot export, because no export plugin is loaded. + + + + + Error while executing VACUUM on the database %1: %2 + + + + + VACUUM execution finished successfully. + + + + + Integrity check (%1) + + + + + Reset autoincrement + + + + + Are you sure you want to reset autoincrement value for table '%1'? + + + + + An error occurred while trying to reset autoincrement value for table '%1': %2 + + + + + Autoincrement value for table '%1' has been reset successfly. + + + + + Are you sure you want to delete all data from table '%1'? + + + + + An error occurred while trying to delete data from table '%1': %2 + + + + + All data has been deleted for table '%1'. + + + + + Following objects will be deleted: %1. + + + + + Following databases will be removed from list: %1. + + + + + Remainig objects from deleted group will be moved in place where the group used to be. + + + + + %1<br><br>Are you sure you want to continue? + + + + + Delete objects + + + + + DbTreeItemDelegate + + + error + dbtree labels + + + + + (system table) + database tree label + + + + + (virtual) + virtual table label + + + + + (system index) + database tree label + + + + + DbTreeModel + + + Database: %1 + dbtree tooltip + + + + + Version: + dbtree tooltip + + + + + File size: + dbtree tooltip + + + + + Encoding: + dbtree tooltip + + + + + Error: + dbtree tooltip + + + + + Table : %1 + dbtree tooltip + + + + + Columns (%1): + dbtree tooltip + + + + + Indexes (%1): + dbtree tooltip + + + + + Triggers (%1): + dbtree tooltip + + + + + Copy + + + + + Move + + + + + Include data + + + + + Include indexes + + + + + Include triggers + + + + + Abort + + + + + Referenced tables + + + + + Do you want to include following referenced tables as well: +%1 + + + + + Name conflict + + + + + Following object already exists in the target database. +Please enter new, unique name, or press '%1' to abort the operation: + + + + + SQL statements conversion + + + + + Following error occurred while converting SQL statements to the target SQLite version: + + + + + Would you like to ignore those errors and proceed? + + + + + DdlHistoryWindow + + + Filter by database: + + + + + -- Queries executed on database %1 (%2) +-- Date and time of execution: %3 +%4 + + + + + DDL history + + + + + DdlPreviewDialog + + + Queries to be executed + + + + + Don't show again + + + + + DebugConsole + + + SQLiteStudio Debug Console + + + + + EditorWindow + + + Query + + + + + History + + + + + Results in the separate tab + + + + + Results below the query + + + + + + SQL editor %1 + + + + + Results + + + + + Execute query + + + + + Explain query + + + + + Clear execution history + sql editor + + + + + Export results + sql editor + + + + + Create view from query + sql editor + + + + + Previous database + + + + + Next database + + + + + Show next tab + sql editor + + + + + Show previous tab + sql editor + + + + + Focus results below + sql editor + + + + + Focus SQL editor above + sql editor + + + + + Active database (%1/%2) + + + + + Query finished in %1 second(s). Rows affected: %2 + + + + + Query finished in %1 second(s). + + + + + Clear execution history + + + + + Are you sure you want to erase the entire SQL execution history? This cannot be undone. + + + + + Cannot export, because no export plugin is loaded. + + + + + No database selected in the SQL editor. Cannot create a view for unknown database. + + + + + Editor window "%1" has uncommited data. + + + + + ErrorsConfirmDialog + + + Errors + + + + + Following errors occured: + + + + + Would you like to proceed? + + + + + ExportDialog + + + Export + + + + + What do you want to export? + + + + + A database + + + + + A single table + + + + + Query results + + + + + Table to export + + + + + Database + + + + + Table + + + + + Options + + + + + When this option is unchecked, then only table DDL (CREATE TABLE statement) is exported. + + + + + Export table data + + + + + Export table indexes + + + + + Export table triggers + + + + + Note, that exporting table indexes and triggers may be unsupported by some output formats. + + + + + Select database objects to export + + + + + Export data from tables + + + + + Select all + + + + + Deselect all + + + + + + Database: + + + + + Query to export results for + + + + + Query to be executed for results: + + + + + Export format and options + + + + + Export format + + + + + Output + + + + + Exported file path + + + + + Clipboard + + + + + File + + + + + Exported text encoding: + + + + + Export format options + + + + + Cancel + + + + + + + Select database to export. + + + + + Select table to export. + + + + + Enter valid query to export. + + + + + Select at least one object to export. + + + + + You must provide a file name to export to. + + + + + Path you provided is an existing directory. You cannot overwrite it. + + + + + The directory '%1' does not exist. + + + + + The file '%1' exists and will be overwritten. + + + + + All files (*) + + + + + Pick file to export to + + + + + Internal error during export. This is a bug. Please report it. + + + + + FontEdit + + + Choose font + font configuration + + + + + Form + + + Active SQL formatter plugin + + + + + FormView + + + Commit row + form view + + + + + Rollback row + form view + + + + + First row + form view + + + + + Previous row + form view + + + + + Next row + form view + + + + + Last row + form view + + + + + Insert new row + form view + + + + + Delete current row + form view + + + + + FunctionsEditor + + + Filter funtions + + + + + Input arguments + + + + + Undefined + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Type: + + + + + Function name: + + + + + Implementation language: + + + + + Initialization code: + + + + + + Function implementation code: + + + + + Final step implementation code: + + + + + SQL function editor + + + + + Commit all function changes + + + + + Rollback all function changes + + + + + Create new function + + + + + Delete selected function + + + + + Custom SQL functions manual + + + + + Add function argument + + + + + Rename function argument + + + + + Delete function argument + + + + + Move function argument up + + + + + Move function argument down + + + + + Scalar + + + + + Aggregate + + + + + Enter a non-empty, unique name of the function. + + + + + Pick the implementation language. + + + + + Per step code: + + + + + Enter a non-empty implementation code. + + + + + argument + new function argument name in function editor window + + + + + Functions editor window has uncommited modifications. + + + + + ImportDialog + + + Import data + + + + + Table to import to + + + + + Table + + + + + Database + + + + + Data source to import from + + + + + Data source type + + + + + Options + + + + + Text encoding: + + + + + Input file: + + + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + + + Ignore errors + + + + + Data source options + + + + + Cancel + + + + + If you type table name that doesn't exist, it will be created. + + + + + Enter the table name + + + + + Select import plugin. + + + + + You must provide a file to import from. + + + + + The file '%1' does not exist. + + + + + Path you provided is a directory. A regular file is required. + + + + + Pick file to import from + + + + + IndexDialog + + + + Index + + + + + On table: + + + + + Index name: + + + + + Partial index condition + + + + + Unique index + + + + + Column + + + + + Collation + + + + + Sort + + + + + DDL + + + + + Tried to open index dialog for closed or inexisting database. + + + + + Could not process index %1 correctly. Unable to open an index dialog. + + + + + Pick the table for the index. + + + + + Select at least one column. + + + + + Enter a valid condition. + + + + + default + index dialog + + + + + Sort order + table constraints + + + + + + Error + index dialog + + + + + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? + + + + + An error occurred while executing SQL statements: +%1 + + + + + LanguageDialog + + + Language + + + + + Please choose language: + + + + + MainWindow + + + Database toolbar + + + + + Structure toolbar + + + + + Tools + + + + + Window list + + + + + View toolbar + + + + + Configuration widgets + + + + + Syntax highlighting engines + + + + + Data editors + + + + + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. + + + + + Running in debug mode. Debug messages are printed to the standard output. + + + + + You need to restart application to make the language change take effect. + + + + + Open SQL editor + + + + + Open DDL history + + + + + Open SQL functions editor + + + + + Open collations editor + + + + + Import + + + + + Export + + + + + Open configuration dialog + + + + + Tile windows + + + + + Tile windows horizontally + + + + + Tile windows vertically + + + + + Cascade windows + + + + + Next window + + + + + Previous window + + + + + Hide status field + + + + + Close selected window + + + + + Close all windows but selected + + + + + Close all windows + + + + + Restore recently closed window + + + + + Rename selected window + + + + + Open Debug Console + + + + + Open CSS Console + + + + + Report a bug + + + + + Propose a new feature + + + + + About + + + + + Licenses + + + + + Open home page + + + + + Open forum page + + + + + User Manual + + + + + SQLite documentation + + + + + Report history + + + + + Check for updates + + + + + Database + menubar + + + + + Structure + menubar + + + + + View + menubar + + + + + Window list + menubar view menu + + + + + Tools + menubar + + + + + Help + + + + + Could not set style: %1 + main window + + + + + Cannot export, because no export plugin is loaded. + + + + + Cannot import, because no import plugin is loaded. + + + + + Rename window + + + + + Enter new name for the window: + + + + + New updates are available. <a href="%1">Click here for details</a>. + + + + + You're running the most recent version. No updates are available. + + + + + Database passed in command line parameters (%1) was already on the list under name: %2 + + + + + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 + + + + + Could not add database %1 to list. + + + + + MdiWindow + + + Uncommited changes + + + + + Close anyway + + + + + Don't close + + + + + MultiEditor + + + Null value + multieditor + + + + + Configure editors for this data type + + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. + + + + + Deleted + multieditor + + + + + Read only + multieditor + + + + + MultiEditorBool + + + Boolean + + + + + MultiEditorDate + + + Date + + + + + MultiEditorDateTime + + + Date & time + + + + + MultiEditorHex + + + Hex + + + + + MultiEditorNumeric + + + Number + numeric multi editor tab name + + + + + MultiEditorText + + + Text + + + + + Tab changes focus + + + + + Cut + + + + + Copy + + + + + Paste + + + + + Delete + + + + + Undo + + + + + Redo + + + + + MultiEditorTime + + + Time + + + + + NewConstraintDialog + + + New constraint + + + + + + Primary Key + new constraint dialog + + + + + + Foreign Key + new constraint dialog + + + + + + Unique + new constraint dialog + + + + + + Check + new constraint dialog + + + + + Not NULL + new constraint dialog + + + + + Collate + new constraint dialog + + + + + Default + new constraint dialog + + + + + NewVersionDialog + + + SQLiteStudio updates + + + + + New updates are available! + + + + + Component + + + + + Current version + + + + + Update version + + + + + Check for updates on startup + + + + + Update to new version! + + + + + The update will be automatically downloaded and installed. This will also restart application at the end. + + + + + Not now. + + + + + Don't install the update and close this window. + + + + + PopulateConfigDialog + + + Populating configuration + + + + + Configuring <b>%1</b> for column <b>%2</b> + + + + + PopulateDialog + + + Populate table + + + + + Database + + + + + Table + + + + + Columns + + + + + Number of rows to populate: + + + + + Populate + populate dialog button + + + + + Abort + + + + + Configure + + + + + Populating configuration for this column is invalid or incomplete. + + + + + Select database with table to populate + + + + + Select table to populate + + + + + You have to select at least one column. + + + + + QObject + + + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). + + + + + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. + + + + + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. + + + + + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. + + + + + Cannot edit results of query other than %1. + + + + + Cannot edit columns that are result of aggregated %1 statements. + + + + + Cannot edit columns that are result of %1 statement. + + + + + Cannot edit columns that are result of common table expression statement (%1). + + + + + + + + on conflict: %1 + data view tooltip + + + + + references table %1, column %2 + data view tooltip + + + + + condition: %1 + data view tooltip + + + + + collation name: %1 + data view tooltip + + + + + Data grid view + + + + + Copy cell(s) contents to clipboard + + + + + Paste cell(s) contents from clipboard + + + + + Set empty value to selected cell(s) + + + + + Set NULL value to selected cell(s) + + + + + Commit changes to cell(s) contents + + + + + Rollback changes to cell(s) contents + + + + + Delete selected data row + + + + + Insert new data row + + + + + Open contents of selected cell in a separate editor + + + + + Total pages available: %1 + + + + + Total rows loaded: %1 + + + + + Data view (both grid and form) + + + + + Refresh data + + + + + Switch to grid view of the data + + + + + Switch to form view of the data + + + + + Database list + + + + + Delete selected item + + + + + Clear filter contents + + + + + Refresh schema + + + + + Refresh all schemas + + + + + Add database + + + + + Select all items + + + + + Copy selected item(s) + + + + + + + Paste from clipboard + + + + + Tables + + + + + Indexes + + + + + Triggers + + + + + Views + + + + + Columns + + + + + Data form view + + + + + Commit changes for current row + + + + + Rollback changes for current row + + + + + Go to first row on current page + + + + + Go to next row + + + + + Go to previous row + + + + + Go to last row on current page + + + + + Insert new row + + + + + Delete current row + + + + + Main window + + + + + Open SQL editor + + + + + Previous window + + + + + Next window + + + + + Hide status area + + + + + Open configuration dialog + + + + + Open Debug Console + + + + + Open CSS Console + + + + + Cell text value editor + + + + + + Cut selected text + + + + + + Copy selected text + + + + + + Delete selected text + + + + + + Undo + + + + + + Redo + + + + + SQL editor input field + + + + + Select whole editor contents + + + + + Save contents into a file + + + + + Load contents from a file + + + + + Find in text + + + + + Find next + + + + + Find previous + + + + + Replace in text + + + + + Delete current line + + + + + Request code assistant + + + + + Format contents + + + + + Move selected block of text one line down + + + + + Move selected block of text one line up + + + + + Copy selected block of text and paste it a line below + + + + + Copy selected block of text and paste it a line above + + + + + All SQLite databases + + + + + All files + + + + + + Database file + + + + + Reports history window + + + + + Delete selected entry + + + + + SQL editor window + + + + + Execute query + + + + + Execute "%1" query + + + + + Switch current working database to previous on the list + + + + + Switch current working database to next on the list + + + + + Go to next editor tab + + + + + Go to previous editor tab + + + + + Move keyboard input focus to the results view below + + + + + Move keyboard input focus to the SQL editor above + + + + + Table window + + + + + Refresh table structure + + + + + Add new column + + + + + Edit selected column + + + + + Delete selected column + + + + + Export table data + + + + + Import data to the table + + + + + Add new table constraint + + + + + Edit selected table constraint + + + + + Delete selected table constraint + + + + + Refresh table index list + + + + + Add new index + + + + + Edit selected index + + + + + Delete selected index + + + + + Refresh table trigger list + + + + + + Add new trigger + + + + + + Edit selected trigger + + + + + + Delete selected trigger + + + + + + Go to next tab + + + + + + Go to previous tab + + + + + A view window + + + + + Refresh view trigger list + + + + + QuitConfirmDialog + + + Uncommited changes + + + + + Are you sure you want to quit the application? + +Following items are pending: + + + + + SearchTextDialog + + + Find or replace + + + + + Find: + + + + + Case sensitive + + + + + Search backwards + + + + + Regular expression matching + + + + + Replace && +find next + + + + + Replace with: + + + + + Replace all + + + + + Find + + + + + SortDialog + + + Sort by columns + + + + + + Column + + + + + + Order + + + + + Sort by: %1 + + + + + Move column up + + + + + Move column down + + + + + SqlEditor + + + Cut + sql editor + + + + + Copy + sql editor + + + + + Paste + sql editor + + + + + Delete + sql editor + + + + + Select all + sql editor + + + + + Undo + sql editor + + + + + Redo + sql editor + + + + + Complete + sql editor + + + + + Format SQL + sql editor + + + + + Save SQL to file + sql editor + + + + + Select file to save SQL + sql editor + + + + + Load SQL from file + sql editor + + + + + Delete line + sql editor + + + + + Move block down + sql editor + + + + + Move block up + sql editor + + + + + Copy block down + sql editor + + + + + Copy up down + sql editor + + + + + Find + sql editor + + + + + Find next + sql editor + + + + + Find previous + sql editor + + + + + Replace + sql editor + + + + + Could not open file '%1' for writing: %2 + + + + + Saved SQL contents to file: %1 + + + + + Syntax completion can be used only when a valid database is set for the SQL editor. + + + + + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. + + + + + Save to file + + + + + SQL scripts (*.sql);;All files (*) + + + + + Open file + + + + + Could not open file '%1' for reading: %2 + + + + + Reached the end of document. Hit the find again to restart the search. + + + + + SqlQueryItem + + + Column: + data view tooltip + + + + + Data type: + data view + + + + + Table: + data view tooltip + + + + + Constraints: + data view tooltip + + + + + This cell is not editable, because: %1 + + + + + Cannot load the data for a cell that refers to the already closed database. + + + + + SqlQueryItemDelegate + + + + Cannot edit this cell. Details: %2 + + + + + The row is marked for deletion. + + + + + SqlQueryModel + + + + Only one query can be executed simultaneously. + + + + + Uncommited data + + + + + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. + + + + + Cannot commit the data for a cell that refers to the already closed database. + + + + + Could not begin transaction on the database. Details: %1 + + + + + An error occurred while commiting the transaction: %1 + + + + + An error occurred while rolling back the transaction: %1 + + + + + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. + + + + + An error occurred while commiting the data: %1 + + + + + + Error while executing SQL query on database '%1': %2 + + + + + Error while loading query results: %1 + + + + + Insert multiple rows + + + + + Number of rows to insert: + + + + + SqlQueryView + + + Copy + + + + + Copy as... + + + + + Paste + + + + + Paste as... + + + + + Set NULL values + + + + + Erase values + + + + + Edit value in editor + + + + + Commit + + + + + Rollback + + + + + Commit selected cells + + + + + Rollback selected cells + + + + + Define columns to sort by + + + + + Remove custom sorting + + + + + Insert row + + + + + Insert multiple rows + + + + + Delete selected row + + + + + No items selected to paste clipboard contents to. + + + + + Edit value + + + + + SqlTableModel + + + Error while commiting new row: %1 + + + + + Error while deleting row from table %1: %2 + + + + + StatusField + + + Status + + + + + Copy + + + + + Clear + + + + + TableConstraintsModel + + + Type + table constraints + + + + + Details + table constraints + + + + + Name + table constraints + + + + + TableForeignKeyPanel + + + Foreign table: + + + + + SQLite 2 does not support foreign keys officially, +but it's okay to use them anyway. + + + + + Columns + + + + + Local column + + + + + Foreign column + + + + + Reactions + + + + + Deferred foreign key + + + + + Named constraint + + + + + Constraint name + + + + + Pick the foreign column. + + + + + Pick the foreign table. + + + + + Select at least one foreign column. + + + + + Enter a name of the constraint. + + + + + Foreign column + table constraints + + + + + TablePrimaryKeyAndUniquePanel + + + Columns + + + + + Column + + + + + Collation + + + + + Sort + + + + + Valid only for a single column with INTEGER data type + + + + + Autoincrement + + + + + Named constraint + + + + + Constraint name + + + + + On conflict + + + + + Collate + table constraints + + + + + Sort order + table constraints + + + + + Select at least one column. + + + + + Enter a name of the constraint. + + + + + TableStructureModel + + + Name + table structure columns + + + + + Data type + table structure columns + + + + + Default value + table structure columns + + + + + TableWindow + + + Structure + + + + + Table name: + + + + + Data + + + + + Constraints + + + + + Indexes + + + + + Triggers + + + + + DDL + + + + + Export table + table window + + + + + Import data to table + table window + + + + + Populate table + table window + + + + + Refresh structure + table window + + + + + Commit structure changes + table window + + + + + Rollback structure changes + table window + + + + + Add column + table window + + + + + Edit column + table window + + + + + + Delete column + table window + + + + + Move column up + table window + + + + + Move column down + table window + + + + + Create similar table + table window + + + + + Reset autoincrement value + table window + + + + + Add table constraint + table window + + + + + Edit table constraint + table window + + + + + Delete table constraint + table window + + + + + Move table constraint up + table window + + + + + Move table constraint down + table window + + + + + Add table primary key + table window + + + + + Add table foreign key + table window + + + + + Add table unique constraint + table window + + + + + Add table check constraint + table window + + + + + Refresh index list + table window + + + + + Create index + table window + + + + + Edit index + table window + + + + + Delete index + table window + + + + + Refresh trigger list + table window + + + + + Create trigger + table window + + + + + Edit trigger + table window + + + + + Delete trigger + table window + + + + + Are you sure you want to delete column '%1'? + table window + + + + + Following problems will take place while modifying the table. +Would you like to proceed? + table window + + + + + Table modification + table window + + + + + Could not load data for table %1. Error details: %2 + + + + + Could not process the %1 table correctly. Unable to open a table window. + + + + + Could not restore window %1, because no database or table was stored in session for this window. + + + + + Could not restore window '%1', because no database or table was stored in session for this window. + + + + + Could not restore window '%1', because database %2 could not be resolved. + + + + + Could not restore window '%1'', because the table %2 doesn't exist in the database %3. + + + + + + New table %1 + + + + + Could not commit table structure. Error message: %1 + table window + + + + + Reset autoincrement + + + + + Are you sure you want to reset autoincrement value for table '%1'? + + + + + An error occurred while trying to reset autoincrement value for table '%1': %2 + + + + + Autoincrement value for table '%1' has been reset successfly. + + + + + Empty name + + + + + A blank name for the table is allowed in SQLite, but it is not recommended. +Are you sure you want to create a table with blank name? + + + + + Cannot create a table without at least one column. + + + + + Cannot create table %1, if it has no primary key defined. Either uncheck the %2, or define a primary key. + + + + + Cannot use autoincrement for primary key when %1 clause is used. Either uncheck the %2, or the autoincrement in a primary key. + + + + + Are you sure you want to delete table constraint '%1'? + table window + + + + + Delete constraint + table window + + + + + Cannot export, because no export plugin is loaded. + + + + + Cannot import, because no import plugin is loaded. + + + + + Uncommited changes + + + + + There are uncommited structure modifications. You cannot browse or edit data until you have table structure settled. +Do you want to commit the structure, or do you want to go back to the structure tab? + + + + + Go back to structure tab + + + + + Commit modifications and browse data. + + + + + Name + table window indexes + + + + + Unique + table window indexes + + + + + Columns + table window indexes + + + + + Partial index condition + table window indexes + + + + + Name + table window triggers + + + + + Event + table window triggers + + + + + Condition + table window triggers + + + + + Details + table window triggers + + + + + Table window "%1" has uncommited structure modifications and data. + + + + + Table window "%1" has uncommited data. + + + + + Table window "%1" has uncommited structure modifications. + + + + + TriggerColumnsDialog + + + Trigger columns + + + + + Triggering columns: + + + + + TriggerDialog + + + + Trigger + + + + + On table: + + + + + Action: + + + + + + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> + + + + + Pre-condition: + + + + + The scope is still not fully supported by the SQLite database. + + + + + Trigger name: + + + + + When: + + + + + List of columns for UPDATE OF action. + + + + + Scope: + + + + + Code: + + + + + Trigger statements to be executed. + + + + + DDL + + + + + On view: + + + + + Could not process trigger %1 correctly. Unable to open a trigger dialog. + + + + + Enter a valid condition. + + + + + Enter a valid trigger code. + + + + + Error + trigger dialog + + + + + An error occurred while executing SQL statements: +%1 + + + + + VersionConvertSummaryDialog + + + Database version convert + + + + + Following changes to the SQL statements will be made: + + + + + Before + + + + + After + + + + + ViewWindow + + + Query + + + + + View name: + + + + + Data + + + + + Triggers + + + + + DDL + + + + + + Could not restore window '%1', because no database or view was stored in session for this window. + + + + + Could not restore window '%1', because database %2 could not be resolved. + + + + + Could not restore window '%1', because database %2 could not be open. + + + + + Could not restore window '%1', because the view %2 doesn't exist in the database %3. + + + + + + New view %1 + + + + + Refresh the view + view window + + + + + Commit the view changes + view window + + + + + Rollback the view changes + view window + + + + + Refresh trigger list + view window + + + + + Create new trigger + view window + + + + + Edit selected trigger + view window + + + + + Delete selected trigger + view window + + + + + View window "%1" has uncommited structure modifications and data. + + + + + View window "%1" has uncommited data. + + + + + View window "%1" has uncommited structure modifications. + + + + + Could not load data for view %1. Error details: %2 + + + + + Uncommited changes + + + + + There are uncommited structure modifications. You cannot browse or edit data until you have the view structure settled. +Do you want to commit the structure, or do you want to go back to the structure tab? + + + + + Go back to structure tab + + + + + Commit modifications and browse data. + + + + + Could not commit view changes. Error message: %1 + view window + + + + + Name + view window triggers + + + + + Instead of + view window triggers + + + + + Condition + view window triggers + + + + + Details + table window triggers + + + + + Could not process the %1 view correctly. Unable to open a view window. + + + + + Empty name + + + + + A blank name for the view is allowed in SQLite, but it is not recommended. +Are you sure you want to create a view with blank name? + + + + + The SELECT statement could not be parsed. Please correct the query and retry. +Details: %1 + + + + + The view could not be modified due to internal SQLiteStudio error. Please report this! + + + + + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. + + + + + Following problems will take place while modifying the view. +Would you like to proceed? + view window + + + + + View modification + view window + + + + + WidgetCover + + + Interrupt + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts index b38c58b..8671753 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts @@ -891,7 +891,7 @@ ale można go używać. ConfigDialog - + Configuration Konfiguracja @@ -972,258 +972,285 @@ ale można go używać. Ogranicz początkową szerokość kolumn danych (w pikselach): - + + Inserting new row in data grid + + + + + Before currently selected row + + + + + + + General.InsertRowPlacement + + + + + After currently selected row + + + + + At the end of data view + + + + Data types Type danych - + Available editors: Dostępne edytory: - + Editors selected for this data type: Edytory wybrane dla tego typu danych: - + Schema editing Edycja schematu - + Number of DDL changes kept in history. Liczba zmian DDL trzymanych w historii. - + DDL history size: Rozmiar historii DDL: - + Don't show DDL preview dialog when commiting schema changes Nie pokazuj okna podglądu DDL podczas zatwierdzania zmian schematu - + SQL queries Zapytania SQL - - + + Number of queries kept in the history. Liczba zapytań trzymana w historii. - + History size: Rozmiar historii: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Jeśli w oknie edytora SQL jest więcej niż jedno zapytanie, to (jeśli ta opcja jest włączona) tylko jedno zapytanie będzie wykonana - to, które znajduje się pod kursorem pisania. W przeciwnym wypadku wszystkie zapytania będą wykonywane. Zawsze możesz ograniczyć zapytania do wywołania przez zaznaczenie tych zapytań, które chcesz wywołać.</p> - + Execute only the query under the cursor Wykonuj tylko zapytania będące pod kursorem - + Updates Aktualizacje - + Automatically check for updates at startup Sprawdzaj aktualizacje automatycznie przy starcie - + Session Sesje - + Restore last session (active MDI windows) after startup Przywróć ostatnią sesję (aktywne okna MDI) po starcie - + Filter shortcuts by name or key combination Filtruj skróty po nazwie, lub kombinacji klawiszy - + Action Akcja - + Key combination Kombinacja klawiszy - + Changing language requires application restart to take effect. Zmiana języka wymaga restartu aplikacji, aby zadziałać. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout - + General.CompactLayout - + Database list Lista baz - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. Gdy wyłączone, to kolumny będą ułożone w takiej kolejności, w jakiej wystąpiły w zapytaniu CREATE TABLE. - + Sort table columns alphabetically Sortuj kolumny tabel alfabetycznie. - + Expand tables node when connected to a database Rozwiń listę tabel po połączeniu z bazą danych - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> <p>Dodatkowe etykiety, to te wyświetlane obok nazw na liście baz danych (są niebieskie, chyba że skonfigurowano je inaczej). Włączenie tej opcji spowoduje wyświetlenie etykiet dla baz danych, niepoprawnych baz danych, oraz dla węzłów agregujących (grupa kolumn, grupa indeksów, grupa wyzwalaczy). Więcej etykiet jest dostępne niżej.</p> - + Display additional labels on the list Wyświetlaj dodatkowe etykiety na liście - + For regular tables labels will show number of columns, indexes and triggers for each of tables. Dla zwykłych tabel etykiety będą pokazywać liczbę kolumn, inseksów, oraz wyzwalaczy dla tych tabel. - + Display labels for regular tables Wyświetlaj etykiety dla zwykłych tabel - + Virtual tables will be marked with a 'virtual' label. Tabele wirtualne będą oznaczone etykietą 'wirtualna'. - + Display labels for virtual tables Wyświetlaj etykiety dla tabel wirtualnych - + Expand views node when connected to a database Rozwiń listę widoków po połączeniu z bazą. - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) Gdy ta opcja jest wyłączona, to wszystkie obiekty będą ułożone w takiej kolejności, w jakiej występują w tabeli sqlite_master (czyli w takiej, w jakiej zostały stworzone) - + Sort objects (tables, indexes, triggers and views) alphabetically Sortuj obiekty (tabele, indeksy, wyzwalacze i widoki) alfabetycznie - + Display system tables and indexes on the list Wyświetlaj tabele i indeksy systemowe na liście - + Table windows Okna tabel - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. Gdy włączone, Okna Tabel będą się pokazywać z zakładką danych, zamiast z zakładką struktury. - + Open Table Windows with the data tab for start Otwieraj Okna Tabeli z zakładką danych na początek - + View windows Okna Widoków - + When enabled, View Windows will show up with the data tab, instead of the structure tab. Gdy włączone, Okna Widoków będą się pokazywać z zakładką danych, zamiast z zakładką struktury. - + Open View Windows with the data tab for start Otwieraj Okna Widoku z zakładką danych na początek - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins Ukryj wtyczki wbudowane - + Current style: Aktualny styl: - + Preview Podgląd - + Enabled Włączone @@ -1232,193 +1259,193 @@ ale można go używać. Kolumna - + Disabled Wyłączone - - + + Language Język - + Active formatter plugin Aktywna wtyczka formatera - + SQL editor font Czcionka edytora SQL - + Database list font Czcionka listy baz danych - + Database list additional label font Czcionka dodatkowych etykiety listy baz danych - + Data view font Czcionka widoku danych - + Status field font Czcionka pola statusu - + SQL editor colors Kolory edytora SQL - + Current line background Tło bieżącej linii - + <p>SQL strings are enclosed with single quote characters.</p> <p>Łańcuchy znaków SQL są zamknięte pomiędzy znakami apostrofu.</p> - + String foreground Czcionka łańcucha znaków - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <b>Parametry wiążące to wyrażenia zastępcze dla wartości, które mają być dopiero dostarczone przez użytkownika. Mają one jedną z form: </p><ul><li>:nazwa_parametru</li><li>$nazwa_parametru</li><li>@nazwa_parametru</li><li>?</li></ul> - + Bind parameter foreground Czcionka parametru wiążącego - + Highlighted parenthesis background Tło podświetlonych nawiasów - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>Wartości BLOB są wartościami binarnymi, reprezentowanymi jako liczby heksadecymalne, jak np:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground Standardowa czcionka - + Line numbers area background Tło obszaru numerów linii - + Keyword foreground Czcionka słowa kluczowego - + Number foreground Czcionka liczby - + Comment foreground Czcionka komentarza - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Poprawne obiekty to nazwy tabel, indekstów, wyzwalaczy i widoków, które istnieją w basie SQLite.</p> - + Valid objects foreground Czcionka poprawnych obiektów - + Data view colors Kolory widoku danych - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> <p>Jakakolwiek zmiana danych będzie obrysowana tym kolorem, dopóki nie zostanie zatwierdzona do bazy danych.</p> - + Uncommited data outline color Kolor obrysu niezatwierdzonych danych - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> <p>W przypadku błędu podczas zatwierdzania zmian danych, komórka będąca przyczyną problemu zostanie obrysowana tym kolorem.</p> - + Commit error outline color Kolor obrysu błędu zatwierdzania - + NULL value foreground Kolor czcionki wartości NULL - + Deleted row background Tło wiersza usuniętego - + Database list colors Kolory listy baz danych - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Dodatkowe etykiety to te, które mówią o wersji SQLite, liczbie obiektów w głębszych częściach drzewa, itp.</p> - + Additional labels foreground Czcionka dodatkowych etykiet - + Status field colors Kolory pola statusu - + Information message foreground Czcionka wiadomości informującej - + Warning message foreground Czcionka wiadomości ostrzegającej - + Error message foreground Czcionka wiadomości błędu @@ -1680,98 +1707,116 @@ ale można go używać. Odśwież dane tabeli - + First page data view Pierwsza strona - + Previous page data view Poprzednia strona - + Next page data view Następna strona - + Last page data view Ostatnia strona - + Apply filter data view Zastosuj filtr - + Commit changes for selected cells data view Zatwierdź zmiany dla wybranych komórek - + Rollback changes for selected cells data view Wycofaj zmiany dla wybranych komórek - + Show grid view of results sql editor Pokaż widok siatki dla wyników - + Show form view of results sql editor Pokaż widok formularza dla wyników - + Filter by text data view Filtruj po tekście - + Filter by the Regular Expression data view Filtruj używając Wyrażeń Regularnych - + Filter by SQL expression data view Filtruj używając wyrażenia SQL - + Tabs on top data view Karty na górze - + Tabs at bottom data view Karty na dole - + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Całkowita liczba wierszy jest liczona. Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostanie zakończone. - + Row: %1 Wiersz: %1 @@ -1930,7 +1975,7 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani - + File Plik @@ -1959,42 +2004,42 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani Testuj połączenie z bazą - + Browse for existing database file on local computer Przeglądaj lokalny komputer w poszukiwaniu istniejącej bazy - + Browse Przeglądaj - + Enter an unique database name. Wprowadź unikalną nazwę bazy danych. - + This name is already in use. Please enter unique name. Ta nazwa jest już w użyciu. Proszę wprowadzić unikalną nazwę. - + Enter a database file path. Wprowadź ścieżkę do pliku bazy danych. - + This database is already on the list under name: %1 Ta baza jest już na liście pod nazwą: %1 - + Select a database type. Wybierz typ bazy danych. - + Auto-generated Auto-generowana @@ -2003,7 +2048,7 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani Nazwa będzie generowana automatycznie - + Type the name Wprowadź nazwę @@ -3288,42 +3333,42 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Opcje źródła danych - + Cancel Anuluj - + If you type table name that doesn't exist, it will be created. Jeśli wpiszesz nazwę tabeli, która nie istnieje, to zostanie ona stworzona. - + Enter the table name Wprowadź nazwę tabeli - + Select import plugin. Wybierz wtyczkę importu - + You must provide a file to import from. Musisz podać plik z którego należy zaimportować. - + The file '%1' does not exist. Plik '%1' nie istnieje. - + Path you provided is a directory. A regular file is required. Ścieżka którą podałeś jest katalogiem. Wymagany jest zwykły plik. - + Pick file to import from Wybierz plik do importu @@ -3414,19 +3459,19 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Kierunek sortowania - - + + Error index dialog Błąd - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? Nie można utworzyć indeksu, ponieważ wartości w wybranych kolumnach nie są unikalne. Czy chcesz wykonać zapytanie SELECT, aby zobaczyć wartości stwarzające problem? - + An error occurred while executing SQL statements: %1 Wystąpił błąd podczas wykonywania zapytań SQL: @@ -3499,248 +3544,248 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Uruchomiono tryb debugowania. Wiadomości debugujące są wyświetlane na standardowym wyjściu. - + You need to restart application to make the language change take effect. Należy zrestartować aplikację, aby nastąpiła zmiana języka. - + Open SQL editor Otwórz edytor SQL - + Open DDL history Otwórz historię DDL - + Open SQL functions editor Otwórz edytor funkcji SQL - + Open collations editor Otwórz edytor zestawień - + Import Importuj - + Export Eksportuj - + Open configuration dialog Otwórz okno konfiguracji - + Tile windows Ustaw okna w płytki - + Tile windows horizontally Ustaw okno poziomo - + Tile windows vertically Ustaw okna pionowo - + Cascade windows Ustaw okna caskadowo - + Next window Następne okno - + Previous window Poprzednie okno - + Hide status field Ukryj pole statusu - + Close selected window Zamknij wybrane okno - + Close all windows but selected Zamknij wszystkie okna, oprócz wybranego - + Close all windows Zamknij wszystkie okna - + Restore recently closed window Przywróć ostatnio zamknięte okno - + Rename selected window Zmień nazwę wybranego okna - + Open Debug Console Otwórz Konsolę Debugowania - + Open CSS Console - + Report a bug Zgłoś błąd - + Propose a new feature Zgłoś pomysł - + About O programie - + Licenses Licencje - + Open home page Otwórz stronę domową - + Open forum page Otwórz stronę forum - + User Manual Podręcznik Użytkownika - + SQLite documentation Dokumentacja SQLite - + Report history Historia zgłoszeń - + Check for updates Sprawdź aktualizacje - + Database menubar Baza danych - + Structure menubar Struktura - + View menubar Widok - + Window list menubar view menu Lista okien - + Tools menubar Narzędzia - + Help Pomoc - + Could not set style: %1 main window Nie udało się ustawić stylu: %1 - + Cannot export, because no export plugin is loaded. Nie można wyeksportować, ponieważ żadna wtyczka eksportu nie została załadowana. - + Cannot import, because no import plugin is loaded. Nie można zaimportować, ponieważ żadna wtyczka importu nie została załadowana. - + Rename window Zmień nazwę okna - + Enter new name for the window: Wprowadź nową nazwę dla okna: - + New updates are available. <a href="%1">Click here for details</a>. Nowe aktualizacje są dostępne: <a href="%1">Kliknij aby poznać szczegóły</a>. - + You're running the most recent version. No updates are available. Uruchomiona jest najnowsza wersja. Nie ma dostępnych aktualizacji. - + Database passed in command line parameters (%1) was already on the list under name: %2 Baza danych podana w parametrach linii poleceń (%1) była już na liście pod nazwą: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 Baza danych podana w linii poleceń (%1) jest tymczasowo dodana do listy pod nazwą: %2 - + Could not add database %1 to list. Nie udało się dodać bazy danych %1 do listy. @@ -4194,12 +4239,12 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Otwórz zawartość wybranej komórki w osobnym edytorze - + Total pages available: %1 Liczba dostępnych stron: %1 - + Total rows loaded: %1 Liczba załadowanych wierszy: %1 @@ -4266,7 +4311,7 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer - + Paste from clipboard Wklej ze schowka @@ -4387,106 +4432,106 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer - + Cut selected text Wytnij wybrany tekst - + Copy selected text Skopiuj wybrany tekst - + Delete selected text Usuń wybrany tekst - + Undo Cofnij - + Redo Przywróć - + SQL editor input field Pole wprowadzania edytora SQL - + Select whole editor contents Zaznacz całą zawartość edytora - + Save contents into a file Zapisz zawartość do pliku - + Load contents from a file Wczytaj zawartość z pliku - + Find in text Znajdź w tekście - + Find next Znajdź następny - + Find previous Znajdź poprzedni - + Replace in text Zmień w tekście - + Delete current line Usuń bieżącą linię - + Request code assistant Wywołaj asystenta kodu - + Format contents Formatuj zawartość - + Move selected block of text one line down Przenieś wybrany blok tekstu o jedną linię w dół - + Move selected block of text one line up Przenieś wybrany blok tekstu o jedną linię w górę - + Copy selected block of text and paste it a line below Skopiuj wybrany blok tekstu i wklej go poniżej - + Copy selected block of text and paste it a line above Skopiuj wybrany blok tekstu i wklej go powyżej @@ -4782,173 +4827,173 @@ znajdź następny SqlEditor - + Cut sql editor Wytnij - + Copy sql editor Kopiuj - + Paste sql editor Wklej - + Delete sql editor Usuń - + Select all sql editor Zaznacz wszystko - + Undo sql editor Cofnij - + Redo sql editor Przywróć - + Complete sql editor Dopełnij - + Format SQL sql editor Formatuj SQL - + Save SQL to file sql editor Zapisz SQL do pliku - + Select file to save SQL sql editor - + Load SQL from file sql editor Wczytaj SQL z pliku - + Delete line sql editor Usuń linię - + Move block down sql editor Przesuń blok w dół - + Move block up sql editor Przesuń blok w górę - + Copy block down sql editor Skopiuj blok w dół - + Copy up down sql editor Skopiuj blok w górę - + Find sql editor Znajdź - + Find next sql editor Znajdź następny - + Find previous sql editor Znajdź poprzedni - + Replace sql editor Zastąp - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. Dopełnianie składni może być użyte tylko wtedy, gdy poprawna baza danych jest ustawiona w edytorze SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Zawartość edytora SQL jest ogromna, więc sprawdzanie błędów i podświetlanie istniejących obiektów zostało tymczasowo wyłączone. - + Save to file Zapisz do pliku - + Could not open file '%1' for writing: %2 Nie udało się otworzyć pliku '%1' do zapisu: %2 - + SQL scripts (*.sql);;All files (*) Skrypty SQL (*.sql);;Wszystkie pliki (*) - + Open file Otwórz plik - + Could not open file '%1' for reading: %2 Nie udało się otworzyć pliku '%1' do odczytu: %2 - + Reached the end of document. Hit the find again to restart the search. Osiągnięto koniec dokumentu. Wciśnij szukanie ponownie, aby zrestartować szukanie. @@ -5068,12 +5113,12 @@ znajdź następny Błąd podczas wczytywania wyników zapytania: %1 - + Insert multiple rows Wstaw wiele wierszy - + Number of rows to insert: Liczba wierszy do wstawienia: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts index 491b6ea..9d1c8bb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts @@ -888,7 +888,7 @@ but it's okay to use it. ConfigDialog - + Configuration @@ -969,449 +969,476 @@ but it's okay to use it. - + + Inserting new row in data grid + + + + + Before currently selected row + + + + + + + General.InsertRowPlacement + + + + + After currently selected row + + + + + At the end of data view + + + + Data types - + Available editors: - + Editors selected for this data type: - + Schema editing - + Number of DDL changes kept in history. - + DDL history size: - + Don't show DDL preview dialog when commiting schema changes - + SQL queries - - + + Number of queries kept in the history. - + History size: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + Execute only the query under the cursor - + Updates - + Automatically check for updates at startup - + Session - + Restore last session (active MDI windows) after startup - + Filter shortcuts by name or key combination - + Action - + Key combination - - + + Language - + Changing language requires application restart to take effect. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout - + General.CompactLayout - + Database list - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. - + Sort table columns alphabetically - + Expand tables node when connected to a database - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> - + Display additional labels on the list - + For regular tables labels will show number of columns, indexes and triggers for each of tables. - + Display labels for regular tables - + Virtual tables will be marked with a 'virtual' label. - + Display labels for virtual tables - + Expand views node when connected to a database - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) - + Sort objects (tables, indexes, triggers and views) alphabetically - + Display system tables and indexes on the list - + Table windows - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. - + Open Table Windows with the data tab for start - + View windows - + When enabled, View Windows will show up with the data tab, instead of the structure tab. - + Open View Windows with the data tab for start - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + Preview - + Enabled - + Disabled - + Active formatter plugin - + SQL editor font - + Database list font - + Database list additional label font - + Data view font - + Status field font - + SQL editor colors - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - + Uncommited data outline color - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground - + Deleted row background - + Database list colors - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground - + Warning message foreground - + Error message foreground @@ -1673,97 +1700,115 @@ but it's okay to use it. - + First page data view - + Previous page data view - + Next page data view - + Last page data view - + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 @@ -1910,7 +1955,7 @@ Browsing other pages will be possible after the row counting is done. - + File @@ -1931,47 +1976,47 @@ Browsing other pages will be possible after the row counting is done. - + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - + Auto-generated - + Type the name @@ -3226,42 +3271,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3352,19 +3397,19 @@ Please enter new, unique name, or press '%1' to abort the operation: - - + + Error index dialog - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? - + An error occurred while executing SQL statements: %1 @@ -3436,248 +3481,248 @@ Please enter new, unique name, or press '%1' to abort the operation: - + You need to restart application to make the language change take effect. - + Open SQL editor - + Open DDL history - + Open SQL functions editor - + Open collations editor - + Import - + Export - + Open configuration dialog - + Tile windows - + Tile windows horizontally - + Tile windows vertically - + Cascade windows - + Next window - + Previous window - + Hide status field - + Close selected window - + Close all windows but selected - + Close all windows - + Restore recently closed window - + Rename selected window - + Open Debug Console - + Open CSS Console - + Report a bug - + Propose a new feature - + About - + Licenses - + Open home page - + Open forum page - + User Manual - + SQLite documentation - + Report history - + Check for updates - + Database menubar - + Structure menubar - + View menubar - + Window list menubar view menu - + Tools menubar - + Help - + Could not set style: %1 main window - + Cannot export, because no export plugin is loaded. - + Cannot import, because no import plugin is loaded. - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -4127,12 +4172,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Total pages available: %1 - + Total rows loaded: %1 @@ -4199,7 +4244,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Paste from clipboard @@ -4320,106 +4365,106 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next - + Find previous - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above @@ -4712,173 +4757,173 @@ find next SqlEditor - + Cut sql editor - + Copy sql editor - + Paste sql editor - + Delete sql editor - + Select all sql editor - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor - + Save SQL to file sql editor - + Select file to save SQL sql editor - + Load SQL from file sql editor - + Delete line sql editor - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor - + Find next sql editor - + Find previous sql editor - + Replace sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) - + Open file - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. @@ -4994,12 +5039,12 @@ find next - + Insert multiple rows - + Number of rows to insert: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts index af5e93d..4f0ea2c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts @@ -890,7 +890,7 @@ but it's okay to use it. ConfigDialog - + Configuration Конфигурация @@ -971,449 +971,476 @@ but it's okay to use it. Ограничить начальную ширину столбца данных (в пикселях): - + + Inserting new row in data grid + Вставка новой строки в таблице данных + + + + Before currently selected row + Перед текущей выделенной строкой + + + + + + General.InsertRowPlacement + General.InsertRowPlacement + + + + After currently selected row + После текущей выделенной строки + + + + At the end of data view + В конец области просмотра данных + + + Data types Типы данных - + Available editors: Доступные редакторы: - + Editors selected for this data type: Выбранные редакторы для этого типа данных: - + Schema editing Редактирование схемы - + Number of DDL changes kept in history. Количество сохраняемых в истории изменений DDL. - + DDL history size: Размер истории DDL: - + Don't show DDL preview dialog when commiting schema changes Не показывать диалог предпросмотра DDL при подтверждении изменений схемы - + SQL queries SQL запросы - - + + Number of queries kept in the history. Количество сохраняемых в истории запросов. - + History size: Размер истории: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Если в окне редактора SQL введено более одного запроса, то (если данная опция активирована) будет выполнен лишь один запрос - тот, который находится под текстовым курсором. В противном случае будут исполнены все запросы. Вы можете ограничить выполняемые запросы, выделив их перед вызовом выполнения.</p> - + Execute only the query under the cursor Выполнять только запрос под курсором - + Updates Обновления - + Automatically check for updates at startup Автоматически проверять обновления при запуске - + Session Сессия - + Restore last session (active MDI windows) after startup Восстановить предыдущую сессию (активные MDI окна) после запуска - + Filter shortcuts by name or key combination Фильтруйте горячие клавиши по имени или комбинации клавиш - + Action Действие - + Key combination Комбинация клавиш - - + + Language Язык - + Changing language requires application restart to take effect. Для смены языка потребуется перезапустить приложение. - + Compact layout Компактный режим - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> <p>В компактном режиме все поля и отступы в интерфейсе минимизированы для отображения большего количества данных. Интерфейс станет чуть менее эстетичным, однако это позволит уместить больше данных на экране.</p> - + Use compact layout Включить компактный режим - + General.CompactLayout General.CompactLayout - + Database list Список баз данных - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. Если опция деактивирована, столбцы будут отсортированы в том порядке, в котором они были указаны в конструкции CREATE TABLE. - + Sort table columns alphabetically Сортировать столбцы таблицы в алфавитном порядке - + Expand tables node when connected to a database Развернуть список таблиц после подключения к базе данных - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> <p>Дополнительные метки находятся справа от имён в списке баз данных (они отображаются синим цветом, если не выбран иной). При активации этой опции будут отображены метки у баз данных, некорректных баз данных и у групповых узлов (группа столбцов, группа индексов, группа триггеров). Для отображения дополнительных меток воспользуйтесь опциями ниже.<p> - + Display additional labels on the list Отображать дополнительные метки в списке - + For regular tables labels will show number of columns, indexes and triggers for each of tables. Для обычных таблиц метки будут показывать количество столбцов, индексов и триггеров у каждой таблицы. - + Display labels for regular tables Отображать метки у обычных таблиц - + Virtual tables will be marked with a 'virtual' label. Виртуальные таблицы будут помечены как 'вирутальные'. - + Display labels for virtual tables Отображать метки у виртуальных таблиц - + Expand views node when connected to a database Развернуть список представлений после подключения к базе данных - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) Если опция деактивирована, объекты будут отсортированы в том порядке, в котором они указаны в таблице sqlite_master (т.е. в порядке создания) - + Sort objects (tables, indexes, triggers and views) alphabetically Сортировать объекты (таблицы, индексы, триггеры и представления) в алфавитном порядке - + Display system tables and indexes on the list Отображать в списке системные таблицы и индексы - + Table windows Окна таблиц - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. Если опция активирована, окно таблицы будет открыто на вкладке данных вместо вкладки структуры. - + Open Table Windows with the data tab for start Открывать окна таблиц на вкладке данных - + View windows Окна представлений - + When enabled, View Windows will show up with the data tab, instead of the structure tab. Если опция активирована, окно представления будет открыто на вкладке данных вместо вкладки структуры. - + Open View Windows with the data tab for start Открывать окна представлений на вкладке данных - + Main window dock areas Области прикрепления вокруг главного окна - + Left and right areas occupy corners Углы занимают правая и левая области - + Top and bottom areas occupy corners Углы занимают верхняя и нижняя области - + Hide built-in plugins Скрыть встроенные модули - + Current style: Текущий стиль: - + Preview Предпросмотр - + Enabled Активно - + Disabled Неактивно - + Active formatter plugin Активный модуль форматирования - + SQL editor font Шрифт редактора SQL - + Database list font Шрифт списка баз данных - + Database list additional label font Шрифт дополнительных меток в списке баз данных - + Data view font Шрифт просмотра данных - + Status field font Шрифт окна статуса - + SQL editor colors Цвета редактора SQL - + Current line background Фон текущей строки - + <p>SQL strings are enclosed with single quote characters.</p> <p>Строки SQL обрамляются в одинарные кавычки.</p> - + String foreground Цвет строки - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <p>Подстановочные параметры предназначены для значений, которые будут в дальнейшем указаны пользователем. Они определяются одним из следующих способов:</p><ul><li>:имя_параметра</li><li>$имя_параметра</li><li>@имя_параметра</li><li>?</li></ul> - + Bind parameter foreground Цвет подстановочных параметров - + Highlighted parenthesis background Фон подсвечиваемых скобок - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>Данные типа BLOB — это бинарные данные, представляемые в виде шестнадцатеричных чисел, например:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground Цвет данных типа BLOB - + Regular foreground Стандартный цвет - + Line numbers area background Фон области нумерации строк - + Keyword foreground Цвет ключевого слова - + Number foreground Цвет числа - + Comment foreground Цвет комментария - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Распознаваемыми объектами являются имена талиц, индексов, триггеров и представлений, существующих в базе данных SQLite.</p> - + Valid objects foreground Цвет распознанных объектов - + Data view colors Цвета в окне просмотра данных - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> <p>Все изменения данных будут обрамлены этим цветом, пока не будут записаны в базу данных.</p> - + Uncommited data outline color Цвет обрамления неподтверждённых изменений - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> <p>В случае ошибки при подтверждении изменений данных, этим цветом будут обрамлены проблемные ячейки.</p> - + Commit error outline color Цвет обрамления ошибочных ячеек - + NULL value foreground Цвет значений NULL - + Deleted row background Фон удалённых строк - + Database list colors Цвета списка баз данных - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Дополнительные метки содержат информацию о версии SQLite, о количестве объектов в глубине дерева и т.д.</p> - + Additional labels foreground Цвет дополнительных меток - + Status field colors Цвета в окне Статуса - + Information message foreground Цвет информационного сообщения - + Warning message foreground Цвет предупреждения - + Error message foreground Цвет ошибки @@ -1675,98 +1702,116 @@ but it's okay to use it. Обновить данные таблицы - + First page data view Первая страница - + Previous page data view Предыдущая страница - + Next page data view Следующая страница - + Last page data view Последняя страница - + Apply filter data view Применить фильтр - + Commit changes for selected cells data view Подтвердить изменения для выбранных ячеек - + Rollback changes for selected cells data view Откатить изменения для выбранных ячеек - + Show grid view of results sql editor Показать результаты в виде таблицы - + Show form view of results sql editor Показать результаты в виде формы - + Filter by text data view Текстовый фильтр - + Filter by the Regular Expression data view Фильтр по регулярному выражению - + Filter by SQL expression data view Фильтр по выражению SQL - + Tabs on top data view Вкладки сверху - + Tabs at bottom data view Вкладки снизу - + + Place new rows above selected row + data view + Поместить новые строки перед выделенной строкой + + + + Place new rows below selected row + data view + Поместить новые строки после выделенной строки + + + + Place new rows at the end of the data view + data view + Поместить новые строки в конец области просмотра данных + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Идёт подсчёт общего числа строк. Переключение на другие страницы станет возможным после окончания подсчёта. - + Row: %1 Строка: %1 @@ -1925,7 +1970,7 @@ Browsing other pages will be possible after the row counting is done. - + File Файл @@ -1954,42 +1999,42 @@ Browsing other pages will be possible after the row counting is done. Тест соединения с базой данных - + Browse for existing database file on local computer Указать существующий файл базы данных на локальном компьютере - + Browse Обзор - + Enter an unique database name. Введите уникальное имя базы данных. - + This name is already in use. Please enter unique name. Данное имя уже используется. Пожалуйста, укажите уникальное имя. - + Enter a database file path. Введите путь к базе данных. - + This database is already on the list under name: %1 Указанная база данных уже находится в списке под именем %1 - + Select a database type. Выберите тип базы данных. - + Auto-generated Автоматически сгенерировано @@ -1998,7 +2043,7 @@ Browsing other pages will be possible after the row counting is done. Имя будет сгенерировано автоматически - + Type the name Введите имя @@ -3262,42 +3307,42 @@ Please enter new, unique name, or press '%1' to abort the operation:Опции источника данных - + Cancel Отмена - + If you type table name that doesn't exist, it will be created. Если вы введёте несуществующее имя таблицы, она будет создана. - + Enter the table name Введите имя таблицы - + Select import plugin. Выберите модуль импорта. - + You must provide a file to import from. Необходимо указать файл, из которого осуществляется импорт. - + The file '%1' does not exist. Файл '%1' не существует. - + Path you provided is a directory. A regular file is required. Указанный путь является каталогом. Необходимо указать файл. - + Pick file to import from Выберите файл для импорта @@ -3388,19 +3433,19 @@ Please enter new, unique name, or press '%1' to abort the operation:Порядок сортировки - - + + Error index dialog Ошибка - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? Невозможно создать уникальный индекс, т.к. данные в выбранных столбцах неуникальны. Вы хотите выполнить запрос SELECT для просмотра проблемных данных? - + An error occurred while executing SQL statements: %1 При выполнении конструкций SQL произошла ошибка: @@ -3473,248 +3518,248 @@ Please enter new, unique name, or press '%1' to abort the operation:Отладочный режим. Отладочные сообщения выводятся в стандартный выходной поток. - + You need to restart application to make the language change take effect. Для смены языка необходимо перезапустить приложение. - + Open SQL editor Открыть редактор SQL - + Open DDL history Открыть историю DDL - + Open SQL functions editor Открыть редактор функций SQL - + Open collations editor Открыть редактор сравнений - + Import Импорт - + Export Экспорт - + Open configuration dialog Открыть диалог конфигурации - + Tile windows Расположить окна плиткой - + Tile windows horizontally Расположить окна по горизонтали - + Tile windows vertically Расположить окна по вертикали - + Cascade windows Расположить окна каскадом - + Next window Следующее окно - + Previous window Предыдущее окно - + Hide status field Скрыть окно статуса - + Close selected window Закрыть выбранное окно - + Close all windows but selected Закрыть все окна, кроме выбранного - + Close all windows Закрыть все окна - + Restore recently closed window Восстановить недавно закрытые окна - + Rename selected window Переименовать выбранное окно - + Open Debug Console Открыть отладочную консоль - + Open CSS Console Открыть консоль CSS - + Report a bug Сообщить об ошибке - + Propose a new feature Предложить новый функционал - + About О программе - + Licenses Лицензии - + Open home page Открыть домашнюю страницу - + Open forum page Открыть страницу форума - + User Manual Руководство пользователя - + SQLite documentation Документация по SQLite - + Report history История отчётов - + Check for updates Проверить обновления - + Database menubar База данных - + Structure menubar Структура - + View menubar Вид - + Window list menubar view menu Окна - + Tools menubar Инструменты - + Help Справка - + Could not set style: %1 main window Невозможно применить стиль: %1 - + Cannot export, because no export plugin is loaded. Невозможно произвести экспорт, т.к. не загружено ни одного модуля экспорта. - + Cannot import, because no import plugin is loaded. Невозможно произвести импорт, т.к. не загружено ни одного модуля импорта. - + Rename window Переименовать окно - + Enter new name for the window: Введите новое имя для окна: - + New updates are available. <a href="%1">Click here for details</a>. Доступны обновления. <a href="%1">Нажмите здесь для подробностей</a>. - + You're running the most recent version. No updates are available. Установлена последняя версия. Обновлений нет. - + Database passed in command line parameters (%1) was already on the list under name: %2 База данных, переданная через аргументы командной строки (%1), уже находится в списке под именем %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 База данных, переданная через аргументы командной строки (%1), была временно добавлена в список под именем %2 - + Could not add database %1 to list. Невозможно добавить базу данных %1 в список. @@ -4164,12 +4209,12 @@ Please enter new, unique name, or press '%1' to abort the operation:Открыть содержимое выбранной ячейки в отдельном редакторе - + Total pages available: %1 Всего доступно страниц: %1 - + Total rows loaded: %1 Всего загружено строк: %1 @@ -4236,7 +4281,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Paste from clipboard Вставить из буфера обмена @@ -4357,106 +4402,106 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text Вырезать выбранный текст - + Copy selected text Копировать выбранный текст - + Delete selected text Удалить выбранный текст - + Undo Отменить - + Redo Повторить - + SQL editor input field Поле ввода редактора SQL - + Select whole editor contents Выбрать всё содержимое редактора - + Save contents into a file Сохранить содержимое в файл - + Load contents from a file Загрузить содержимое из файла - + Find in text Найти в тексте - + Find next Найти далее - + Find previous Найти предыдущее - + Replace in text Замена в тексте - + Delete current line Удалить текущую строчку - + Request code assistant Вызвать автодополнение - + Format contents Форматировать содержимое - + Move selected block of text one line down Переместить выбранный блок текста на строчку вниз - + Move selected block of text one line up Переместить выбранный блок текста на строчку вверх - + Copy selected block of text and paste it a line below Скопировать блок текста и вставить его строчкой ниже - + Copy selected block of text and paste it a line above Скопировать блок текста и вставить его строчкой выше @@ -4751,173 +4796,173 @@ find next SqlEditor - + Cut sql editor Вырезать - + Copy sql editor Копировать - + Paste sql editor Вставить - + Delete sql editor Удалить - + Select all sql editor Выделить всё - + Undo sql editor Отменить - + Redo sql editor Повторить - + Complete sql editor Завершить - + Format SQL sql editor Форматировать SQL - + Save SQL to file sql editor Сохранить SQL в файл - + Select file to save SQL sql editor Выбрать файл для сохранения SQL - + Load SQL from file sql editor Загрузить SQL из файла - + Delete line sql editor Удалить строчку - + Move block down sql editor Переместить блок вниз - + Move block up sql editor Переместить блок вверх - + Copy block down sql editor Копировать блок вниз - + Copy up down sql editor Копировать блок вверх - + Find sql editor Найти - + Find next sql editor Найти далее - + Find previous sql editor Найти предыдущее - + Replace sql editor Заменить - + Saved SQL contents to file: %1 SQL-код сохранён в файле %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. Дополнение синтаксиса может быть использовано только после назначения корректной базы данных редактору SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Размер содержимого редактора SQL слишком велико, поэтому обнаружение ошибок и подсветка существующих объектов временно отключена. - + Save to file Сохранить в файл - + Could not open file '%1' for writing: %2 Невозможно открыть файл '%1' для записи: %2 - + SQL scripts (*.sql);;All files (*) Скрипты SQL (*.sql);;Все файлы (*) - + Open file Открыть файл - + Could not open file '%1' for reading: %2 Невозможно открыть файл '%1' для чтения: %2 - + Reached the end of document. Hit the find again to restart the search. Достигнут конец документа. Нажмите Найти снова для перезапуска поиска. @@ -5033,12 +5078,12 @@ find next Ошибка при загрузке результатов запроса: %1 - + Insert multiple rows Вставить несколько строк - + Number of rows to insert: Количество вставляемых строк: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts index 332a764..39f70f8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts @@ -215,12 +215,12 @@ Reporting as an unregistered user, using e-mail address. - Nahlásenie ako neregistrovaný užívateľ pomocou emailovej adresy. + Nahlásenie ako neregistrovaný používateľ pomocou emailovej adresy. Reporting as a registered user. - Nahlásenie ako registrovaný užívateľ. + Nahlásenie ako registrovaný používateľ. @@ -372,17 +372,17 @@ Register in all databases - + Registrovať vo všetkých databázach Register in following databases: - + Registrovať v nasledujúcich databázach: Implementation code: - + Implementačný kód: @@ -412,22 +412,22 @@ Editing collations manual - + Manuál úpravy porovnávaní Enter a non-empty, unique name of the collation. - + Zadajte jedinečný názov porovnávania. Pick the implementation language. - + Vyberte implementačný jazyk. Enter a non-empty implementation code. - + Zadajte implementačný kód. @@ -664,7 +664,7 @@ Are you sure you want to delete constraint '%1'? column dialog - + Ste si istý, že chcete vymazať obmedzenie '%1'? @@ -1024,7 +1024,7 @@ but it's okay to use it. <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + <p>Ak je v SQL editore viacej ako jeden dotaz, potom(ak je táto voľba zapnutá) bude vykonaný iba jeden dotaz - ten, na ktorom je kurzor. Ináč budú vykonané všetky dotazy. Vždy si viete vybrať ktoré dotazy budú vykonané a to ich výberom\označením.</p> @@ -1350,12 +1350,12 @@ but it's okay to use it. Data view colors - + Farby dát <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - + <p>Všetky zmeny dát budú ohraničené touto farbou, dokiaľ nebudú potvrdené.</p> @@ -1365,7 +1365,7 @@ but it's okay to use it. <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - + <p>V prípade chyby pri potvrdzovaní zmien dát, budú problematické bunky ohraničené touto farbou.</p> @@ -2268,7 +2268,7 @@ Prezeranie ďalších strán bude možné až po dokončení spočítavania. Erase table data - + Vymazať dáta z tabuľky @@ -2312,24 +2312,24 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny. Delete database - Vymazať databázu + Odstrániť databázu Are you sure you want to delete database '%1'? - Ste si istý, že chcete vymazať databázu '%1'? + Ste si istý, že chcete odstrániť databázu '%1'? Cannot import, because no import plugin is loaded. - Nemôžem importovať, lebo nebol načítaný žiaden plugin na import. + Nemôžem importovať, lebo nebol načítaný žiaden plugin na import. Cannot export, because no export plugin is loaded. - Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. + Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. @@ -2369,27 +2369,27 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny. Are you sure you want to delete all data from table '%1'? - + Ste si istý, že chcete vymazať všetky dáta z tabuľky '%1'? An error occurred while trying to delete data from table '%1': %2 - + Vyskytla sa chyba pri pokuse vymazať dáta z tabuľky '%1': %2 All data has been deleted for table '%1'. - + Všetky dáta z tabuľky '%1' boli vymazané. Following objects will be deleted: %1. - + Nasledujúce objekty budú odstránené: %1. Following databases will be removed from list: %1. - + Nasledujúce databázy budú odstránené zo zoznamu: %1. @@ -2399,12 +2399,12 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny. %1<br><br>Are you sure you want to continue? - + %1<br><br>Ste si istý, že chcete pokračovať? Delete objects - + Odstránenie objektov @@ -3052,7 +3052,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Implementation language: - Implementačný jazyk: + Implementačný jazyk: @@ -3252,7 +3252,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Ignore errors - + Ignorovať chyby @@ -3390,7 +3390,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Error index dialog - + Chyba @@ -3577,7 +3577,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Open CSS Console - + Otvoriť CSS konzolu @@ -3612,7 +3612,7 @@ Please enter new, unique name, or press '%1' to abort the operation: User Manual - Užívateľský manuál + Používateľský manuál @@ -3703,12 +3703,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Database passed in command line parameters (%1) was already on the list under name: %2 - + Databáza prebratá z príkazového riadka (%1) už je v zozname pod názvom: %2 Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Databáza prebratá z príkazového riadka (%1) bola dočasne pridaná do zoznamu pod názvom: %2 @@ -3762,7 +3762,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Read only multieditor - + Iba na čítanie @@ -4013,7 +4013,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Abort - Zrušiť + Zrušiť @@ -4636,7 +4636,7 @@ Please enter new, unique name, or press '%1' to abort the operation: A view window - + Okno pohľadu @@ -4895,7 +4895,7 @@ nájsť ďalší Could not open file '%1' for writing: %2 - + Nemôžem otvoriť súbor '%1' pre zápis: %2 @@ -4910,12 +4910,12 @@ nájsť ďalší Could not open file '%1' for reading: %2 - + Nemôžem otvoriť súbor '%1' na čítanie: %2 Reached the end of document. Hit the find again to restart the search. - + Dosiahnutý koniec súboru. Kliknite na tlačidlo Nájsť pre hľadanie od začiatku súboru. @@ -6020,22 +6020,22 @@ Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? View window "%1" has uncommited structure modifications and data. - + Okno pohľadu "%1" obsahuje nepotrdené zmeny štruktúr a dát. View window "%1" has uncommited data. - + Okno pohľadu "%1" obsahuje nepotrdené dáta. View window "%1" has uncommited structure modifications. - + Okno pohľadu "%1" obsahuje nepotrdené zmeny štruktúr. Could not load data for view %1. Error details: %2 - + Nemôžem načítať dáta z pohľadu %1. Detaily chyby: %2 diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts index 7d8bb85..acefaa8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts @@ -99,7 +99,7 @@ Reporter - 上报人 + 报告者 @@ -150,7 +150,7 @@ You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - 您可以通过选择菜单 “1%”下的“%2”来查看全部您报告的bugs和想法。 + 您可以通过选择菜单 “1%”下的“%2”来查看全部您报告的bugs和想法。 @@ -465,7 +465,7 @@ Enter a collation name. - 输入排序规则名称。 + 输入排序规则名称。 @@ -754,7 +754,7 @@ but it's okay to use it. Autoincrement - + Autoincrement @@ -769,7 +769,7 @@ but it's okay to use it. On conflict: - 冲突: + 冲突: @@ -892,24 +892,24 @@ but it's okay to use it. ConfigDialog - + Configuration - + 配置 Search - + 搜索 General - + 通用 Keyboard shortcuts - + 快捷键 @@ -939,7 +939,7 @@ but it's okay to use it. Code formatters - 代码格式化 + 代码格式化 @@ -973,449 +973,476 @@ but it's okay to use it. 限制宽度(单位:像素): - + + Inserting new row in data grid + + + + + Before currently selected row + 在已选列之前 + + + + + + General.InsertRowPlacement + + + + + After currently selected row + 在已选列之后 + + + + At the end of data view + 在数据显示区域的末尾 + + + Data types 数据类型 - + Available editors: 可用的编辑器: - + Editors selected for this data type: 已选的该数据类型编辑器: - + Schema editing 架构编辑 - + Number of DDL changes kept in history. 数据库定义(DDL)的更改历史记录数量。 - + DDL history size: 数据库定义(DDL)历史大小: - + Don't show DDL preview dialog when commiting schema changes 当提交schema变动时不显示数据库定义(DDL)预览对话框 - + SQL queries SQL查询 - - + + Number of queries kept in the history. 查询历史记录数量。 - + History size: 历史大小: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>如果SQL编辑器中有多个语句,如果启用该选项,只执行光标下的语句;反之则执行全部语句。另外您可以选择需要执行的语句来执行</p> - + Execute only the query under the cursor 只执行光标下的语句 - + Updates 更新 - + Automatically check for updates at startup 在启动时自己检查更新 - + Session 会话 - + Restore last session (active MDI windows) after startup 启动后恢复上一次会话。 - + Filter shortcuts by name or key combination - + Action - + Key combination 按键编定 - - + + Language 语言 - + Changing language requires application restart to take effect. 更改语言后,重启程序生效。 - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout - + General.CompactLayout - + Database list 数据库列表 - + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. 如果关闭,将会以 CREATE TABLE 中的顺序对列进行排序。 - + Sort table columns alphabetically 按字母对列排序 - + Expand tables node when connected to a database 当连接到数据库时,展开数据库节点。 - + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> - + Display additional labels on the list - + For regular tables labels will show number of columns, indexes and triggers for each of tables. - + Display labels for regular tables - + Virtual tables will be marked with a 'virtual' label. - + Display labels for virtual tables - + Expand views node when connected to a database - + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) - + Sort objects (tables, indexes, triggers and views) alphabetically - + Display system tables and indexes on the list - + Table windows - + When enabled, Table Windows will show up with the data tab, instead of the structure tab. - + Open Table Windows with the data tab for start - + View windows - + When enabled, View Windows will show up with the data tab, instead of the structure tab. - + Open View Windows with the data tab for start - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + 当前风格: - + Preview 预览 - + Enabled 已启用 - + Disabled 已禁用 - + Active formatter plugin 启用格式化插件 - + SQL editor font SQL编辑器字体 - + Database list font 数据库字体 - + Database list additional label font 数据库额外标签字体 - + Data view font 数据浏览字体 - + Status field font 状态栏字体 - + SQL editor colors SQL编辑器颜色 - + Current line background 当前行的背景色 - + <p>SQL strings are enclosed with single quote characters.</p> <p>单引号内的SQL字符串</p> - + String foreground 字符串颜色 - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground BLOB值的颜色 - + Regular foreground 背景色 - + Line numbers area background 行号的背景色 - + Keyword foreground 关键字的颜色 - + Number foreground 数字颜色 - + Comment foreground 注释颜色 - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - + Uncommited data outline color - + <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground NULL值的颜色 - + Deleted row background 已删除行的背景色 - + Database list colors 数据库列表颜色 - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground 信息颜色 - + Warning message foreground 警告信息颜色 - + Error message foreground 错误信息颜色 @@ -1453,7 +1480,7 @@ but it's okay to use it. Dependencies: plugin details - + 依赖: @@ -1475,7 +1502,7 @@ but it's okay to use it. %1 (built-in) plugins manager in configuration dialog - + %1 (内建) @@ -1677,99 +1704,117 @@ but it's okay to use it. - + First page data view - + 首页 - + Previous page data view - + 上一页 - + Next page data view - + 下一页 - + Last page data view - + 末页 - + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 - + 行:%1 @@ -1777,27 +1822,27 @@ Browsing other pages will be possible after the row counting is done. Convert database - + 转换数据库 Source database - + 源数据库 Source database version: - + 源数据库版本: Target database - + 目的数据库 Target version: - + 目标版本: @@ -1807,7 +1852,7 @@ Browsing other pages will be possible after the row counting is done. Target file: - + 目标文件: @@ -1822,7 +1867,7 @@ Browsing other pages will be possible after the row counting is done. Select source database - + 选择源数据库 @@ -1875,17 +1920,17 @@ Browsing other pages will be possible after the row counting is done. Database - 数据库 + 数据库 Database type - + 数据类型 Database driver - + 数据库驱动 @@ -1895,17 +1940,17 @@ Browsing other pages will be possible after the row counting is done. Options - 选项 + 选项 Permanent (keep it in configuration) - + 记住该数据库 Test connection - + 测试连接 Name @@ -1918,13 +1963,13 @@ Browsing other pages will be possible after the row counting is done. Create new database file - + 创建新数据库文件 - + File - 文件 + 文件 @@ -1943,49 +1988,49 @@ Browsing other pages will be possible after the row counting is done. - + Browse for existing database file on local computer - + 浏览计算上已存在的文件 - + Browse - + 浏览 - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + 输入数据库文件位置。 - + This database is already on the list under name: %1 - + 该数据库已在列表中:%1 - + Select a database type. - + 选择数据库类型。 - + Auto-generated - + 自动产生 - + Type the name - + 输入名字 @@ -1993,42 +2038,42 @@ Browsing other pages will be possible after the row counting is done. Delete table - + 删除表 Are you sure you want to delete table %1? - + 确定要删除表“%1”吗? Delete index - + 删除索引 Are you sure you want to delete index %1? - + 确定要删除索引“%1”吗? Delete trigger - + 删除触发器 Are you sure you want to delete trigger %1? - + 确定要删除触发器“%1”吗? Delete view - + 删除视图 Are you sure you want to delete view %1? - + 确定要删除视图“%1”吗? @@ -2041,240 +2086,240 @@ Browsing other pages will be possible after the row counting is done. Databases - 数据库 + 数据库 Filter by name - + 过滤名 Copy - 复制 + 复制 Paste - 粘贴 + 粘贴 Select all - 全选 + 全选 Create a group - + 创建分组 Delete the group - + 删除分组 Rename the group - + 重命名分组 Add a database - + 添加数据库 Edit the database - + 编辑数据库 Remove the database - + 移除数据库 Connect to the database - + 连接到数据库 Disconnect from the database - + 断开数据库连接 Import - 导入 + 导入 Export the database - + 导数该数据库 Convert database type - + 转换数据库类型 Vacuum - + 清理 Integrity check - + 检查完整性 Create a table - + 新建表 Edit the table - + 编辑该表 Delete the table - + 删除该表 Export the table - + 导出该表 Import into the table - + 导入到该表 Populate table - + 填充表 Create similar table - + 创建一个相似的表 Reset autoincrement sequence - + 重设 autoincrement Create an index - + 创建索引 Edit the index - + 编辑该索引 Delete the index - + 删除该索引 Create a trigger - + 创建触发器 Edit the trigger - + 编辑该触发器 Delete the trigger - + 删除该触发器 Create a view - + 创建视图 Edit the view - + 编辑该视图 Delete the view - + 删除该视图 Add a column - + 添加字段 Edit the column - + 编辑该字段 Delete the column - + 删除该字段 Delete selected items - + 删除已选项目 Clear filter - + 清除过滤器 Refresh all database schemas - + 刷新全部数据库的结构 Refresh selected database schema - + 刷新已选数据库的结构 Erase table data - + 擦除该表的数据 Database - 数据库 + 数据库 Grouping - + 分组 Create group - + 创建分组 Group name - + 分组名 @@ -2284,95 +2329,96 @@ Browsing other pages will be possible after the row counting is done. Delete group - + 删除分组 Are you sure you want to delete group %1? All objects from this group will be moved to parent group. - + 确认删除组 %1 吗? +删除后该组下的全部内容将被移动到其所属的父分组中。 Delete database - + 删除数据库 Are you sure you want to delete database '%1'? - + 您确定要删除数据库“%1”吗? Cannot import, because no import plugin is loaded. - + 未能导入,因为没有导入插件被加载。 Cannot export, because no export plugin is loaded. - + 未能导出,因为没有导出插件被加载。 Error while executing VACUUM on the database %1: %2 - + 在数据库%1上运行 VACUUM 命令时出错:%2 VACUUM execution finished successfully. - + VACUUM 命令执行完成。 Integrity check (%1) - + 完整性检查(%1) Reset autoincrement - + 重置autoincrement Are you sure you want to reset autoincrement value for table '%1'? - + 您确定要重设“%1”的autoincrement吗? An error occurred while trying to reset autoincrement value for table '%1': %2 - + 在重设表“%1”的autoincrement时出现错误:%2 Autoincrement value for table '%1' has been reset successfly. - + 表“%1”的auincrement重设成功。 Are you sure you want to delete all data from table '%1'? - + 您确定要删除表“%1”中的全部数据吗? An error occurred while trying to delete data from table '%1': %2 - + 删除表“%1”中的数据时出错:%2 All data has been deleted for table '%1'. - + 表“%1”中的数据全部被删除。 Following objects will be deleted: %1. - + 以下内容将被删除:%1。 Following databases will be removed from list: %1. - + 以下数据库将从列表中移除:%1。 @@ -2382,12 +2428,12 @@ All objects from this group will be moved to parent group. %1<br><br>Are you sure you want to continue? - + %1<br><br>继续? Delete objects - + 删除对象 @@ -2396,25 +2442,25 @@ All objects from this group will be moved to parent group. error dbtree labels - + 错误 (system table) database tree label - + (系统表) (virtual) virtual table label - + (虚拟) (system index) database tree label - + (系统索引) @@ -2423,90 +2469,90 @@ All objects from this group will be moved to parent group. Database: %1 dbtree tooltip - 数据库:%1 + 数据库:%1 Version: dbtree tooltip - 版本: + 版本: File size: dbtree tooltip - + 文件大小: Encoding: dbtree tooltip - + 编码: Error: dbtree tooltip - + 错误: Table : %1 dbtree tooltip - + 表:%1 Columns (%1): dbtree tooltip - + 字段(%1) Indexes (%1): dbtree tooltip - + 索引(%1) Triggers (%1): dbtree tooltip - + 触发器(%1) Copy - 复制 + 复制 Move - + 移动 Include data - + 包含数据 Include indexes - + 包含索引 Include triggers - + 包含触发器 Abort - 中止 + 中止 Referenced tables - + 参照表 @@ -2517,7 +2563,7 @@ All objects from this group will be moved to parent group. Name conflict - + 名字冲突 @@ -2538,7 +2584,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Would you like to ignore those errors and proceed? - + 忽略错误并继续? @@ -2546,7 +2592,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Filter by database: - + 数据库过滤: @@ -2558,7 +2604,7 @@ Please enter new, unique name, or press '%1' to abort the operation: DDL history - + DDL历史 @@ -2566,12 +2612,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Queries to be executed - + 将要执行的语句 Don't show again - + 不再显示 @@ -2579,7 +2625,7 @@ Please enter new, unique name, or press '%1' to abort the operation: SQLiteStudio Debug Console - SQLiteStudio 调试终端 + SQLiteStudio 调试终端 @@ -2592,33 +2638,33 @@ Please enter new, unique name, or press '%1' to abort the operation: History - + 历史 Results in the separate tab - + 结果在新标签中打开 Results below the query - + 结果在当前页打开 SQL editor %1 - + SQL编辑器 %1 Results - + 结果 Execute query - + 执行语句 @@ -2629,41 +2675,41 @@ Please enter new, unique name, or press '%1' to abort the operation: Clear execution history sql editor - + 清除执行历史 Export results sql editor - + 导出结果 Create view from query sql editor - + 从query中创建视图 Previous database - + 前一个数据库 Next database - + 下一个数据库 Show next tab sql editor - + 显示下一个标签 Show previous tab sql editor - + 显示上一个标签 @@ -2695,17 +2741,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Clear execution history - + 清除执行历史 Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + 确定要删除全部的SQL执行历史吗?删除后不能恢复。 Cannot export, because no export plugin is loaded. - + 未能导出,因为没有导出插件被加载。 @@ -2715,7 +2761,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Editor window "%1" has uncommited data. - + 编辑器“%1”里有未提交的数据库。 @@ -2723,17 +2769,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Errors - + 错误 Following errors occured: - + 发生了以下错误: Would you like to proceed? - + 仍然继续吗? @@ -2970,49 +3016,49 @@ Please enter new, unique name, or press '%1' to abort the operation: Commit row form view - + 提交 Rollback row form view - + 回滚 First row form view - + 首行 Previous row form view - + 前一行 Next row form view - + 下一行 Last row form view - + 末行 Insert new row form view - + 新插入行 Delete current row form view - + 删除当前行 @@ -3020,42 +3066,42 @@ Please enter new, unique name, or press '%1' to abort the operation: Filter funtions - + 过滤函数 Function name: - + 函数名: Implementation language: - 实现语言: + 实现语言: Type: - + 类型: Input arguments - + 输入参数 Undefined - + Undefined Databases - 数据库 + 数据库 Register in all databases - 在所有数据库中注册 + 在所有数据库中注册 @@ -3065,7 +3111,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Initialization code: - + 初始化代码: @@ -3081,57 +3127,57 @@ Please enter new, unique name, or press '%1' to abort the operation: SQL function editor - + SQL函数编辑器 Commit all function changes - + 提交所有对函数的更改 Rollback all function changes - + 回滚所有对函数的更改 Create new function - + 新建函数 Delete selected function - + 删除已选函数 Custom SQL functions manual - + 自定义SQL函数手册 Add function argument - + 添加函数参数 Rename function argument - + 重命名函数参数 Delete function argument - + 删除函数参数 Move function argument up - + 上移函数参数 Move function argument down - + 下移函数参数 @@ -3146,12 +3192,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Enter a non-empty, unique name of the function. - + 输入非空唯一的函数名称 Pick the implementation language. - 选择实现语言。 + 选择实现语言。 @@ -3180,47 +3226,47 @@ Please enter new, unique name, or press '%1' to abort the operation: Import data - + 导入数据 Table to import to - + 目的表 Table - + Database - 数据库 + 数据库 Data source to import from - + 数据源 Data source type - + 数据源类型 Options - 选项 + 选项 Input file: - + 输入文件: Text encoding: - + 文本编码: @@ -3230,52 +3276,52 @@ Please enter new, unique name, or press '%1' to abort the operation: Ignore errors - + 忽略错误 Data source options - + 数据源选项 - + Cancel - 取消 + 取消 - + If you type table name that doesn't exist, it will be created. - + 如果输入的表不存在,则新建该表。 - + Enter the table name - + 输入表名 - + Select import plugin. - + 选择导入插件。 - + You must provide a file to import from. - + 必须提供一个导入文件。 - + The file '%1' does not exist. - + 文件“%1”不存在。 - + Path you provided is a directory. A regular file is required. - + 你提供的是一个目录。我们需要的是文件。 - + Pick file to import from - + 选择要导入的文件 @@ -3319,12 +3365,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Sort - + 排序 DDL - + DDL @@ -3344,7 +3390,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Select at least one column. - + 至少选择一列 @@ -3355,31 +3401,31 @@ Please enter new, unique name, or press '%1' to abort the operation: default index dialog - + 默认 Sort order table constraints - + 排序 - - + + Error index dialog - + 错误 - + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? - + An error occurred while executing SQL statements: %1 - + 在执行SQL语句时发生了错误:%1 @@ -3400,12 +3446,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Database toolbar - + 数据工具栏 Structure toolbar - + 结构工具栏 @@ -3448,250 +3494,250 @@ Please enter new, unique name, or press '%1' to abort the operation: - + You need to restart application to make the language change take effect. - + 更改语言后重启程序生效。 - + Open SQL editor 打开SQL编辑器 - + Open DDL history 打开数据库定义(DDL)历史 - + Open SQL functions editor 打开SQL函数编辑器 - + Open collations editor - + Import - 导入 + 导入 - + Export 导出 - + Open configuration dialog 打开配置对话框 - + Tile windows 平铺窗口 - + Tile windows horizontally 水平排列窗口 - + Tile windows vertically 垂直排列窗口 - + Cascade windows 层叠窗口 - + Next window 下一个窗口 - + Previous window 上一个窗口 - + Hide status field 隐藏状态栏 - + Close selected window 关闭当前窗口 - + Close all windows but selected 关闭其它窗口 - + Close all windows 关闭全部窗口 - + Restore recently closed window 恢复最近关闭的窗口 - + Rename selected window 重命名当前窗口 - + Open Debug Console 打开调试终端 - + Open CSS Console - + 打开CSS控制台 - + Report a bug 提交Bug - + Propose a new feature 提交新功能建议 - + About 关于 - + Licenses 许可 - + Open home page 访问主页 - + Open forum page 访问论坛 - + User Manual 用户手册 - + SQLite documentation SQLite文档 - + Report history 报告历史 - + Check for updates 检查更新 - + Database menubar 数据库 - + Structure menubar 结构 - + View menubar 查看 - + Window list menubar view menu 窗口列表 - + Tools menubar 工具 - + Help 帮助 - + Could not set style: %1 main window - + 未能设置风格:%1 - + Cannot export, because no export plugin is loaded. - + 未能导出,因为没有导出插件被加载。 - + Cannot import, because no import plugin is loaded. - + 未能导入,因为没有导入插件被加载。 - + Rename window 重命名窗口 - + Enter new name for the window: 窗口的新名称: - + New updates are available. <a href="%1">Click here for details</a>. 有新更新 <a href="%1">点此查看更新详情</a>. - + You're running the most recent version. No updates are available. - 您使用的是最新版,不需要更新。 + 您使用的是最新版,不需要更新。 - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. - + 未能将数据%1添加到列表 @@ -3789,7 +3835,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Text - + 文本 @@ -3880,13 +3926,13 @@ Please enter new, unique name, or press '%1' to abort the operation: Collate new constraint dialog - 排序规则 + 排序规则 Default new constraint dialog - 默认 + 默认 @@ -3947,7 +3993,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Populating configuration - + 配置填充 @@ -3960,7 +4006,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Populate table - + 填充表 @@ -3980,23 +4026,23 @@ Please enter new, unique name, or press '%1' to abort the operation: Number of rows to populate: - + 填充的行数: Populate populate dialog button - + 填充 Abort - 中止 + 中止 Configure - 配置 + 配置 @@ -4011,7 +4057,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Select table to populate - + 选择要填充的表 @@ -4139,12 +4185,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Total pages available: %1 - + Total rows loaded: %1 @@ -4211,7 +4257,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Paste from clipboard @@ -4228,7 +4274,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Triggers - + 触发器 @@ -4278,12 +4324,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Insert new row - + 新插入行 Delete current row - + 删除当前行 @@ -4332,106 +4378,106 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo 撤销 - + Redo 恢复 - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next 查找下一个 - + Find previous 查找上一个 - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above @@ -4627,14 +4673,14 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommited changes - 未提交的更改 + 未提交的更改 Are you sure you want to quit the application? Following items are pending: - + 您确定要退出本程序吗? @@ -4642,17 +4688,17 @@ Following items are pending: Find or replace - + 查找与替换 Find: - + 查找: Case sensitive - + 大小写敏感 @@ -4662,28 +4708,28 @@ Following items are pending: Regular expression matching - + 正则表达式 Replace && find next - + 替换并查找下一个 Replace with: - + 替换为: Replace all - + 全部替换 Find - 查找 + 查找 @@ -4697,13 +4743,13 @@ find next Column - 字段 + 字段 Order - + 排序 @@ -4724,173 +4770,173 @@ find next SqlEditor - + Cut sql editor 剪切 - + Copy sql editor 复制 - + Paste sql editor 粘贴 - + Delete sql editor 删除 - + Select all sql editor 全选 - + Undo sql editor 撤销 - + Redo sql editor 恢复 - + Complete sql editor 完成 - + Format SQL sql editor 格式化SQL - + Save SQL to file sql editor 保存SQL到文件 - + Select file to save SQL sql editor - + Load SQL from file sql editor 从文件加载SQL - + Delete line sql editor 删除行 - + Move block down sql editor 整块下移 - + Move block up sql editor 整块上移 - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor 查找 - + Find next sql editor 查找下一个 - + Find previous sql editor 查找上一个 - + Replace sql editor 替换 - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file 保存到文件 - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) SQL文件 (*.sql);;所有文件 (*) - + Open file 打开文件 - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. 已搜索到文档底部。点击查找从头程序开始搜索。 @@ -4901,25 +4947,25 @@ find next Column: data view tooltip - + 字段: Data type: data view - 数据类型: + 数据类型: Table: data view tooltip - + 表: Constraints: data view tooltip - + 约束: @@ -5006,12 +5052,12 @@ find next - + Insert multiple rows - + 插入多行 - + Number of rows to insert: @@ -5021,32 +5067,32 @@ find next Copy - 复制 + 复制 Copy as... - + 复制为... Paste - 粘贴 + 粘贴 Paste as... - + 粘贴为... Set NULL values - + 设置为NULL Erase values - + 擦除 @@ -5056,12 +5102,12 @@ find next Commit - + 提交 Rollback - + 回滚 @@ -5086,17 +5132,17 @@ find next Insert row - + 插入行 Insert multiple rows - + 插入多行 Delete selected row - + 删除已选行 @@ -5106,7 +5152,7 @@ find next Edit value - + 编辑值 @@ -5114,12 +5160,12 @@ find next Error while commiting new row: %1 - + 写入新行时发生了错误:%1 Error while deleting row from table %1: %2 - + 删除行时发生了错误 %1:%2 @@ -5241,12 +5287,12 @@ but it's okay to use them anyway. Columns - 字段 + 字段 Column - 字段 + 字段 @@ -5256,7 +5302,7 @@ but it's okay to use them anyway. Sort - + 排序 @@ -5266,7 +5312,7 @@ but it's okay to use them anyway. Autoincrement - + Autoincrement @@ -5298,7 +5344,7 @@ but it's okay to use them anyway. Select at least one column. - + 至少选择一列。 @@ -5342,7 +5388,7 @@ but it's okay to use them anyway. Data - + 数据 @@ -5357,7 +5403,7 @@ but it's okay to use them anyway. Triggers - + 触发器 @@ -5380,7 +5426,7 @@ but it's okay to use them anyway. Populate table table window - + 填充表 @@ -5519,7 +5565,7 @@ but it's okay to use them anyway. Delete index table window - + 删除索引 @@ -5543,7 +5589,7 @@ but it's okay to use them anyway. Delete trigger table window - + 删除触发器 @@ -5609,7 +5655,7 @@ Would you like to proceed? Reset autoincrement - + 重置autoincrement @@ -5667,12 +5713,12 @@ Are you sure you want to create a table with blank name? Cannot export, because no export plugin is loaded. - + 未能导出,因为没有导出插件被加载。 Cannot import, because no import plugin is loaded. - + 未能导入,因为没有导入插件被加载。 @@ -5865,13 +5911,13 @@ Do you want to commit the structure, or do you want to go back to the structure Error trigger dialog - + 错误 An error occurred while executing SQL statements: %1 - + 在执行SQL语句“%1”时发生了错误。 @@ -5879,7 +5925,7 @@ Do you want to commit the structure, or do you want to go back to the structure Database version convert - + 数据库版本转换 @@ -5889,12 +5935,12 @@ Do you want to commit the structure, or do you want to go back to the structure Before - + 之前 After - + 之后 @@ -5912,12 +5958,12 @@ Do you want to commit the structure, or do you want to go back to the structure Data - + 数据 Triggers - + 触发器 diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp index 02a1052..cd1ba72 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp @@ -46,6 +46,7 @@ #include #include #include +#include // TODO extend QTableView for columns and constraints, so they show full-row-width drop indicator, // instead of single column drop indicator. diff --git a/SQLiteStudio3/sqlitestudio/sqlitestudio.pro b/SQLiteStudio3/sqlitestudio/sqlitestudio.pro index 63d0d50..d8384d8 100644 --- a/SQLiteStudio3/sqlitestudio/sqlitestudio.pro +++ b/SQLiteStudio3/sqlitestudio/sqlitestudio.pro @@ -33,7 +33,8 @@ LIBS += -lcoreSQLiteStudio -lguiSQLiteStudio SOURCES += main.cpp -TRANSLATIONS += translations/sqlitestudio_zh_CN.ts \ +TRANSLATIONS += translations/sqlitestudio_it.ts \ + translations/sqlitestudio_zh_CN.ts \ translations/sqlitestudio_sk.ts \ translations/sqlitestudio_de.ts \ translations/sqlitestudio_ru.ts \ @@ -72,3 +73,4 @@ RESOURCES += \ + diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts index 7072f7c..ce4a973 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts @@ -6,68 +6,70 @@ GUI interface to SQLiteStudio, a SQLite manager. - + GUI Schnittstelle zu SQLiteStudio, ein SQLite Manager. Enables debug messages in console (accessible with F12). - + Aktiviert Debug-Meldungen in der Konsole (erreichbar über F12) Redirects debug messages into standard output (forces debug mode). - + Leitet Debug-Meldungen in den Standardausgabekanal um (erzwingt den Debugmodus) Redirects debug messages into given file (forces debug mode). - + Leitet Debug-Meldungen in die angegebene Datei um (erzwingt den Debugmodus) log file - + Logdatei Enables Lemon parser debug messages for SQL code assistant. - + Aktiviert Lemon Parser Debug-Meldungen für den SQL Codeassistenten. Enables debugging of every single SQL query being sent to any database. - + Aktiviert das Debugging für jede SQL Abfrage, die an eine beliebige Datenbank gesendet wurde. Limits SQL query messages to only the given <database>. - + Wird <database> bei Ausgabe der Meldung in die aktuelle Datenbankbezeichnung umgewandelt? + Begrenzt SQL Abfragemeldungen auf folgende Datenbank: <database>. database - + Datenbank Lists plugins installed in the SQLiteStudio and quits. - + Was wird hier beendet? + Listet die in SQLiteStudio installierten Plugins auf und beendet. file - + Datei Database file to open - + Zu öffnende Datenbankdatei Error - + Fehler diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_it.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_it.ts new file mode 100644 index 0000000..f0caedd --- /dev/null +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_it.ts @@ -0,0 +1,73 @@ + + + + + QObject + + + GUI interface to SQLiteStudio, a SQLite manager. + + + + + Enables debug messages in console (accessible with F12). + + + + + Redirects debug messages into standard output (forces debug mode). + + + + + Redirects debug messages into given file (forces debug mode). + + + + + log file + + + + + Enables Lemon parser debug messages for SQL code assistant. + + + + + Enables debugging of every single SQL query being sent to any database. + + + + + Limits SQL query messages to only the given <database>. + + + + + database + + + + + Lists plugins installed in the SQLiteStudio and quits. + + + + + file + + + + + Database file to open + + + + + + Error + + + + diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts index 711f4a2..3ca5a22 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts index 222126a..ec8bd90 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts @@ -26,7 +26,7 @@ log file - + 日志文件 @@ -46,28 +46,28 @@ database - + 数据库 Lists plugins installed in the SQLiteStudio and quits. - + 列出已安装的插件并退出。 file - + 文件 Database file to open - + 要打开的数据库文件 Error - + 错误 diff --git a/SQLiteStudio3/sqlitestudiocli/cli.cpp b/SQLiteStudio3/sqlitestudiocli/cli.cpp index 0f527ac..87c4f93 100644 --- a/SQLiteStudio3/sqlitestudiocli/cli.cpp +++ b/SQLiteStudio3/sqlitestudiocli/cli.cpp @@ -9,12 +9,14 @@ #include "common/utils_sql.h" #include "climsghandler.h" #include "clicompleter.h" +#include "services/notifymanager.h" #include #include #include #include #include #include +#include #if defined(Q_OS_WIN32) #include "readline.h" @@ -36,6 +38,9 @@ CLI::CLI(QObject* parent) : history_base = 0; // for some reason this was set to 1 under Unix, making 1st history entry to be always ommited #endif + connect(NOTIFY_MANAGER, SIGNAL(notifyInfo(QString)), this, SLOT(printInfo(QString))); + connect(NOTIFY_MANAGER, SIGNAL(notifyWarning(QString)), this, SLOT(printWarn(QString))); + connect(NOTIFY_MANAGER, SIGNAL(notifyError(QString)), this, SLOT(printError(QString))); loadHistory(); CliCompleter::getInstance()->init(this); @@ -43,6 +48,7 @@ CLI::CLI(QObject* parent) : CLI::~CLI() { + safe_delete(thread); } CLI* CLI::getInstance() @@ -53,6 +59,11 @@ CLI* CLI::getInstance() return instance; } +void CLI::dispose() +{ + safe_delete(instance); +} + void CLI::start() { thread = new QThread(this); @@ -153,6 +164,24 @@ int CLI::historyLength() const #endif } +void CLI::printWarn(const QString &msg) +{ + static_qstring(tpl, "[WARNING] %1"); + qOut << tpl.arg(msg) << "\n"; +} + +void CLI::printError(const QString &msg) +{ + static_qstring(tpl, "[ERROR] %1"); + qOut << tpl.arg(msg) << "\n"; +} + +void CLI::printInfo(const QString &msg) +{ + static_qstring(tpl, "[INFO] %1"); + qOut << tpl.arg(msg) << "\n"; +} + void CLI::waitForExecution() { executionFinished = false; diff --git a/SQLiteStudio3/sqlitestudiocli/cli.h b/SQLiteStudio3/sqlitestudiocli/cli.h index 6f7c927..12f391b 100644 --- a/SQLiteStudio3/sqlitestudiocli/cli.h +++ b/SQLiteStudio3/sqlitestudiocli/cli.h @@ -20,6 +20,7 @@ class CLI : public QObject ~CLI(); static CLI* getInstance(); + static void dispose(); void start(); void setCurrentDb(Db* db); @@ -48,8 +49,10 @@ class CLI : public QObject bool doExit = false; QString line; - signals: - void execCommand(CliCommand* cmd); + private slots: + void printInfo(const QString& msg); + void printWarn(const QString& msg); + void printError(const QString& msg); public slots: void doWork(); @@ -57,6 +60,9 @@ class CLI : public QObject void executionComplete(); void clearHistory(); void openDbFile(const QString& path); + + signals: + void execCommand(CliCommand* cmd); }; #endif // CLI_H diff --git a/SQLiteStudio3/sqlitestudiocli/clicommandexecutor.cpp b/SQLiteStudio3/sqlitestudiocli/clicommandexecutor.cpp index 6a3072e..66707cc 100644 --- a/SQLiteStudio3/sqlitestudiocli/clicommandexecutor.cpp +++ b/SQLiteStudio3/sqlitestudiocli/clicommandexecutor.cpp @@ -8,7 +8,9 @@ CliCommandExecutor::CliCommandExecutor(QObject *parent) : void CliCommandExecutor::execCommand(CliCommand* cmd) { - connect(cmd, SIGNAL(execComplete()), this, SLOT(asyncExecutionComplete())); + if (cmd->isAsyncExecution()) + connect(cmd, SIGNAL(execComplete()), this, SLOT(asyncExecutionComplete())); + cmd->execute(); if (!cmd->isAsyncExecution()) { diff --git a/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.cpp b/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.cpp index 4865e23..f32b75e 100644 --- a/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.cpp +++ b/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.cpp @@ -1,4 +1,8 @@ #include "clicommanddesc.h" +#include "cli.h" +#include "schemaresolver.h" +#include "parser/ast/sqlitecreatevirtualtable.h" +#include "cliutils.h" CliCommandDesc::CliCommandDesc() { @@ -6,7 +10,41 @@ CliCommandDesc::CliCommandDesc() void CliCommandDesc::execute() { + if (!cli->getCurrentDb()) + { + println(tr("No working database is set.\n" + "Call %1 command to set working database.\n" + "Call %2 to see list of all databases.") + .arg(cmdName("use")).arg(cmdName("dblist"))); + return; + } + + Db* db = cli->getCurrentDb(); + if (!db || !db->isOpen()) + { + println(tr("Database is not open.")); + return; + } + + QString table = syntax.getArgument(TABLE); + SchemaResolver resolver(db); + SqliteQueryPtr query = resolver.getParsedObject(table, SchemaResolver::TABLE); + if (!query || (!query.dynamicCast() && !query.dynamicCast())) + { + println(tr("Cannot find table named: %1").arg(table)); + return; + } + + SqliteCreateTablePtr createTable = query.dynamicCast(); + if (createTable) + { + printTable(createTable.data()); + return; + } + + SqliteCreateVirtualTablePtr virtualTable = query.dynamicCast(); + printVirtualTable(virtualTable.data()); } QString CliCommandDesc::shortHelp() const @@ -24,3 +62,59 @@ void CliCommandDesc::defineSyntax() syntax.setName("desc"); syntax.addArgument(TABLE, tr("table")); } + +void CliCommandDesc::printTable(SqliteCreateTable *table) +{ + int termCols = getCliColumns(); + println(pad("", termCols, '-')); + println(tr("Table: %1").arg(table->table)); + + // Header + QString msg; + msg = pad(tr("Column name"), 20, ' '); + msg += "|"; + msg += pad(tr("Data type"), 10, ' '); + msg += "|"; + int lgt3rd = termCols - msg.length(); + printHorizontalLine(lgt3rd); + msg += pad(tr("Constraints"), lgt3rd, ' '); + println(msg); + printHorizontalLine(lgt3rd); + + // Rows + QString constrJoinStr = "\n" + pad("", 20, ' ') + "|" + pad("", 10, ' ') + "|"; + QStringList constrList; + for (SqliteCreateTable::Column* column : table->columns) + { + msg = pad(column->name.left(20), 20, ' '); + msg += "|"; + msg += pad((column->type ? column->type->detokenize().left(10) : ""), 10, ' '); + msg += "|"; + + constrList.clear(); + for (SqliteCreateTable::Column::Constraint* constr : column->constraints) + constrList << pad(constr->detokenize().left(lgt3rd), lgt3rd, ' '); + + msg += constrList.join(constrJoinStr); + println(msg); + } +} + +void CliCommandDesc::printVirtualTable(SqliteCreateVirtualTable *table) +{ + println(tr("Virtual table: %1").arg(table->table)); + if (table->args.size() > 0) + { + int i = 1; + println(tr("Construction arguments:")); + for (const QString& arg : table->args) + println(pad(QString::number(i++), 2, ' ') + ". " + arg); + } + else + println(tr("No construction arguments were passed for this virtual table.")); +} + +void CliCommandDesc::printHorizontalLine(int lgt3rd) +{ + println(pad("", 20, '-') + "+" + pad("", 10, '-') + "+" + pad("", lgt3rd, '-')); +} diff --git a/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.h b/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.h index 46876df..3c06c6a 100644 --- a/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.h +++ b/SQLiteStudio3/sqlitestudiocli/commands/clicommanddesc.h @@ -3,6 +3,9 @@ #include "clicommand.h" +class SqliteCreateTable; +class SqliteCreateVirtualTable; + class CliCommandDesc : public CliCommand { Q_OBJECT @@ -13,6 +16,11 @@ class CliCommandDesc : public CliCommand QString shortHelp() const; QString fullHelp() const; void defineSyntax(); + + private: + void printTable(SqliteCreateTable* table); + void printVirtualTable(SqliteCreateVirtualTable* table); + void printHorizontalLine(int lgt3rd); }; #endif // CLICOMMANDDESC_H diff --git a/SQLiteStudio3/sqlitestudiocli/commands/clicommanduse.cpp b/SQLiteStudio3/sqlitestudiocli/commands/clicommanduse.cpp index ef0f641..9706221 100644 --- a/SQLiteStudio3/sqlitestudiocli/commands/clicommanduse.cpp +++ b/SQLiteStudio3/sqlitestudiocli/commands/clicommanduse.cpp @@ -6,7 +6,7 @@ void CliCommandUse::execute() { - if (syntax.isArgumentSet(DB_NAME)) + if (!syntax.isArgumentSet(DB_NAME)) { if (!cli->getCurrentDb()) { diff --git a/SQLiteStudio3/sqlitestudiocli/main.cpp b/SQLiteStudio3/sqlitestudiocli/main.cpp index 4bec619..eb7a46e 100644 --- a/SQLiteStudio3/sqlitestudiocli/main.cpp +++ b/SQLiteStudio3/sqlitestudiocli/main.cpp @@ -90,6 +90,7 @@ int main(int argc, char *argv[]) CLI::getInstance()->openDbFile(dbToOpen); CLI::getInstance()->start(); - - return a.exec(); + int res = a.exec(); + CLI::dispose(); + return res; } diff --git a/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.pro b/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.pro index 4e3bae0..705a00c 100644 --- a/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.pro +++ b/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.pro @@ -27,7 +27,8 @@ linux { } } -TRANSLATIONS += translations/sqlitestudiocli_zh_CN.ts \ +TRANSLATIONS += translations/sqlitestudiocli_it.ts \ + translations/sqlitestudiocli_zh_CN.ts \ translations/sqlitestudiocli_sk.ts \ translations/sqlitestudiocli_de.ts \ translations/sqlitestudiocli_ru.ts \ @@ -124,3 +125,4 @@ RESOURCES += \ + diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts index 9dee56c..f544581 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts @@ -4,32 +4,32 @@ CLI - + Current database: %1 - + No current working database is set. - + Type %1 for help - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. - + closed @@ -201,15 +201,67 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + Cannot find table named: %1 + + + + shows details about the table - + table + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts index d446494..7d3b5c5 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts @@ -4,32 +4,32 @@ CLI - + Current database: %1 - + No current working database is set. - + Type %1 for help - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. - + closed @@ -201,15 +201,67 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + Cannot find table named: %1 + + + + shows details about the table - + table + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts index 5096d8c..cdcfb5b 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts @@ -4,32 +4,32 @@ CLI - + Current database: %1 Base de données actuelle: %1 - + No current working database is set. Aucune base de données en cours n'est activée. - + Type %1 for help Touche %1 pour l'aide - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. Impossible d'ajouter la base de données %1 à la liste. - + closed Fermé @@ -201,15 +201,69 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + Aucune base de données de travail n'est activée. +Appelez la commande %1 pour activer la base de données active. +Appelez %2 pour voir la liste de toutes les bases de données. + + + + Database is not open. + La base de données n'est pas ouverte. + + + + Cannot find table named: %1 + + + + shows details about the table Affichage des détails de la table - + table Table + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_it.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_it.ts new file mode 100644 index 0000000..959e194 --- /dev/null +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_it.ts @@ -0,0 +1,788 @@ + + + + + CLI + + + Current database: %1 + + + + + No current working database is set. + + + + + Type %1 for help + + + + + Database passed in command line parameters (%1) was already on the list under name: %2 + + + + + Could not add database %1 to list. + + + + + closed + + + + + CliCommand + + + Usage: %1%2 + + + + + CliCommandAdd + + + Could not add database %1 to list. + + + + + Database added: %1 + + + + + adds new database to the list + + + + + Adds given database pointed by <path> with given <name> to list the databases list. The <name> is just a symbolic name that you can later refer to. Just pick any unique name. For list of databases already on the list use %1 command. + + + + + name + CLI command syntax + + + + + path + CLI command syntax + + + + + CliCommandCd + + + Changed directory to: %1 + + + + + Could not change directory to: %1 + + + + + changes current working directory + + + + + Very similar command to 'cd' known from Unix systems and Windows. It requires a <path> argument to be passed, therefore calling %1 will always cause a change of the directory. To learn what's the current working directory use %2 command and to list contents of the current working directory use %3 command. + + + + + path + CLI command syntax + + + + + CliCommandClose + + + Cannot call %1 when no database is set to be current. Specify current database with %2 command or pass database name to %3. + + + + + + Connection to database %1 closed. + + + + + No such database: %1. Use %2 to see list of known databases. + + + + + closes given (or current) database + + + + + Closes database connection. If the database was already closed, nothing happens. If <name> is provided, it should be name of the database to close (as printed by %1 command). The the <name> is not provided, then current working database is closed (see help for %2 for details). + + + + + name + CLI command syntax + + + + + CliCommandDbList + + + No current working database defined. + + + + + Databases: + + + + + + Name + CLI db name column + + + + + + Open + CLI connection state column + + + + + + Closed + CLI connection state column + + + + + + Connection + CLI connection state column + + + + + + Database file path + + + + + prints list of registered databases + + + + + Prints list of databases registered in the SQLiteStudio. Each database on the list can be in open or closed state and %1 tells you that. The current working database (aka default database) is also marked on the list with '*' at the start of its name. See help for %2 command to learn about the default database. + + + + + CliCommandDesc + + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + Cannot find table named: %1 + + + + + shows details about the table + + + + + table + + + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + + + + CliCommandDir + + + lists directories and files in current working directory + + + + + This is very similar to 'dir' command known from Windows and 'ls' command from Unix systems. + +You can pass <pattern> with wildcard characters to filter output. + + + + + pattern + + + + + CliCommandExit + + + quits the application + + + + + Quits the application. Settings are stored in configuration file and will be restored on next startup. + + + + + CliCommandHelp + + + shows this help message + + + + + Use %1 to learn about certain commands supported by the command line interface (CLI) of the SQLiteStudio. +To see list of supported commands, type %2 without any arguments. + +When passing <command> name, you can skip special prefix character ('%3'). + +You can always execute any command with exactly single '--help' option to see help for that command. It's an alternative for typing: %1 <command>. + + + + + command + CLI command syntax + + + + + No such command: %1 + + + + + Type '%1' for list of available commands. + + + + + Usage: %1%2 + + + + + Aliases: %1 + + + + + CliCommandHistory + + + Current history limit is set to: %1 + + + + + prints history or erases it + + + + + When no argument was passed, this command prints command line history. Every history entry is separated with a horizontal line, so multiline entries are easier to read. + +When the -c or --clear option is passed, then the history gets erased. +When the -l or --limit option is passed, it sets the new history entries limit. It requires an additional argument saying how many entries do you want the history to be limited to. +Use -ql or --querylimit option to see the current limit value. + + + + + number + + + + + Console history erased. + + + + + Invalid number: %1 + + + + + History limit set to %1 + + + + + CliCommandMode + + + Current results printing mode: %1 + + + + + Invalid results printing mode: %1 + + + + + New results printing mode: %1 + + + + + tells or changes the query results format + + + + + When called without argument, tells the current output format for a query results. When the <mode> is passed, the mode is changed to the given one. Supported modes are: +- CLASSIC - columns are separated by a comma, not aligned, +- FIXED - columns have equal and fixed width, they always fit into terminal window width, but the data in columns can be cut off, +- COLUMNS - like FIXED, but smarter (do not use with huge result sets, see details below), +- ROW - each column from the row is displayed in new line, so the full data is displayed. + +The CLASSIC mode is recommended if you want to see all the data, but you don't want to waste lines for each column. Each row will display full data for every column, but this also means, that columns will not be aligned to each other in next rows. The CLASSIC mode also doesn't respect the width of your terminal (console) window, so if values in columns are wider than the window, the row will be continued in next lines. + +The FIXED mode is recommended if you want a readable output and you don't care about long data values. Columns will be aligned, making the output a nice table. The width of columns is calculated from width of the console window and a number of columns. + +The COLUMNS mode is similar to FIXED mode, except it tries to be smart and make columns with shorter values more thin, while columns with longer values get more space. First to shrink are columns with longest headers (so the header names are to be cut off as first), then columns with the longest values are shrinked, up to the moment when all columns fit into terminal window. +ATTENTION! The COLUMNS mode reads all the results from the query at once in order to evaluate column widhts, therefore it is dangerous to use this mode when working with huge result sets. Keep in mind that this mode will load entire result set into memory. + +The ROW mode is recommended if you need to see whole values and you don't expect many rows to be displayed, because this mode displays a line of output per each column, so you'll get 10 lines for single row with 10 columns, then if you have 10 of such rows, you will get 100 lines of output (+1 extra line per each row, to separate rows from each other). + + + + + CliCommandNullValue + + + Current NULL representation string: %1 + + + + + tells or changes the NULL representation string + + + + + If no argument was passed, it tells what's the current NULL value representation (that is - what is printed in place of NULL values in query results). If the argument is given, then it's used as a new string to be used for NULL representation. + + + + + CliCommandOpen + + + Cannot call %1 when no database is set to be current. Specify current database with %2 command or pass database name to %3. + + + + + Could not add database %1 to list. + + + + + File %1 doesn't exist in %2. Cannot open inexisting database with %3 command. To create a new database, use %4 command. + + + + + Database %1 has been open and set as the current working database. + + + + + opens database connection + + + + + Opens connection to the database. If no additional argument was passed, then the connection is open to the current default database (see help for %1 for details). However if an argument was passed, it can be either <name> of the registered database to open, or it can be <path> to the database file to open. In the second case, the <path> gets registered on the list with a generated name, but only for the period of current application session. After restarting application such database is not restored on the list. + + + + + name + CLI command syntax + + + + + path + CLI command syntax + + + + + CliCommandPwd + + + prints the current working directory + + + + + This is the same as 'pwd' command on Unix systems and 'cd' command without arguments on Windows. It prints current working directory. You can change the current working directory with %1 command and you can also list contents of the current working directory with %2 command. + + + + + CliCommandRemove + + + No such database: %1 + + + + + Database removed: %1 + + + + + New current database set: + + + + + removes database from the list + + + + + Removes <name> database from the list of registered databases. If the database was not on the list (see %1 command), then error message is printed and nothing more happens. + + + + + name + CLI command syntax + + + + + CliCommandSql + + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + executes SQL query + + + + + This command is executed every time you enter SQL query in command prompt. It executes the query on the current working database (see help for %1 for details). There's no sense in executing this command explicitly. Instead just type the SQL query in the command prompt, without any command prefixed. + + + + + sql + CLI command syntax + + + + + + Too many columns to display in %1 mode. + + + + + Row %1 + + + + + Query execution error: %1 + + + + + CliCommandTables + + + No such database: %1. Use %2 to see list of known databases. + + + + + Cannot call %1 when no database is set to be current. Specify current database with %2 command or pass database name to %3. + + + + + Database %1 is closed. + + + + + + Database + + + + + Table + + + + + prints list of tables in the database + + + + + Prints list of tables in given <database> or in the current working database. Note, that the <database> should be the name of the registered database (see %1). The output list includes all tables from any other databases attached to the queried database. +When the -s option is given, then system tables are also listed. + + + + + database + CLI command syntax + + + + + CliCommandTree + + + No current working database is selected. Use %1 to define one and then run %2. + + + + + Tables + + + + + Views + + + + + Columns + + + + + Indexes + + + + + + Triggers + + + + + prints all objects in the database as a tree + + + + + Prints all objects (tables, indexes, triggers and views) that are in the database as a tree. The tree is very similar to the one that you can see in GUI client of the SQLiteStudio. +When -c option is given, then also columns will be listed under each table. +When -s option is given, then also system objects will be printed (sqlite_* tables, autoincrement indexes, etc). +The database argument is optional and if provided, then only given database will be printed. This is not a registered database name, but instead it's an internal SQLite database name, like 'main', 'temp', or any attached database name. To print tree for other registered database, call %1 first to switch the working database, and then use %2 command. + + + + + CliCommandUse + + + No current database selected. + + + + + + Current database: %1 + + + + + No such database: %1 + + + + + changes default working database + + + + + Changes current working database to <name>. If the <name> database is not registered in the application, then the error message is printed and no change is made. + +What is current working database? +When you type a SQL query to be executed, it is executed on the default database, which is also known as the current working database. Most of database-related commands can also work using default database, if no database was provided in their arguments. The current database is always identified by command line prompt. The default database is always defined (unless there is no database on the list at all). + +The default database can be selected in various ways: +- using %1 command, +- by passing database file name to the application startup parameters, +- by passing registered database name to the application startup parameters, +- by restoring previously selected default database from saved configuration, +- or when default database was not selected by any of the above, then first database from the registered databases list becomes the default one. + + + + + name + CLI command syntax + + + + + QObject + + + Insufficient number of arguments. + + + + + Too many arguments. + + + + + Invalid argument value: %1. +Expected one of: %2 + + + + + Unknown option: %1 + CLI command syntax + + + + + Option %1 requires an argument. + CLI command syntax + + + + + string + CLI command syntax + + + + + Command line interface to SQLiteStudio, a SQLite manager. + + + + + Enables debug messages on standard error output. + + + + + Enables Lemon parser debug messages for SQL code assistant. + + + + + Lists plugins installed in the SQLiteStudio and quits. + + + + + file + + + + + Database file to open + + + + diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts index c7bdf0f..9a0f67b 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts @@ -169,6 +169,50 @@ table tabela + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + Nie wybrano domyślnej bazy danych. +Użyj polecenia %1, aby ustawić domyślną bazę danych. +Użyj polecenie %2, aby wypisać listę wszystkich baz. + + + Database is not open. + Baz danych nie jest otwarta. + + + Cannot find table named: %1 + + + + Table: %1 + + + + Column name + + + + Data type + + + + Constraints + + + + Virtual table: %1 + + + + Construction arguments: + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts index 5b92d37..0d46151 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts @@ -4,32 +4,32 @@ CLI - + Current database: %1 - + No current working database is set. - + Type %1 for help - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. - + closed @@ -201,15 +201,67 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + Cannot find table named: %1 + + + + shows details about the table - + table + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts index 0cbe067..ef35f51 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts @@ -1,35 +1,35 @@ - + CLI - + Current database: %1 Текущая база данных: %1 - + No current working database is set. Текущая рабочая база данных не определена. - + Type %1 for help Введите %1 для вызова справки - + Database passed in command line parameters (%1) was already on the list under name: %2 База данных, переданная через аргументы командной строки (%1), уже находится в списке под именем %2 - + Could not add database %1 to list. Невозможно добавить базу данных %1 в список. - + closed закрыта @@ -201,15 +201,69 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + Не указана рабочая база данных. +Укажите рабочую базу данных командой %1. +Для просмотра списка баз данных воспользуйтесь командой %2. + + + + Database is not open. + База данных не открыта. + + + + Cannot find table named: %1 + Не удалось найти таблицу с именем %1 + + + shows details about the table отображает сведения о таблице - + table таблица + + + Table: %1 + Таблица: %1 + + + + Column name + Имя столбца + + + + Data type + Тип данных + + + + Constraints + Ограничения + + + + Virtual table: %1 + Виртуальная таблица: %1 + + + + Construction arguments: + Параметры создания: + + + + No construction arguments were passed for this virtual table. + Не указаны параметры создания для этой виртуальной таблицы. + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts index df9da22..e799908 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts @@ -4,32 +4,32 @@ CLI - + Current database: %1 - + No current working database is set. - + Type %1 for help - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. - + closed @@ -201,15 +201,67 @@ CliCommandDesc - + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. + + + + + Cannot find table named: %1 + + + + shows details about the table - + table + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. + + CliCommandDir diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts index 4dd7f0a..71b2ea2 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts @@ -4,34 +4,34 @@ CLI - + Current database: %1 - + 当前数据库:%1 - + No current working database is set. - + 当前没有选定工作数据库。 - + Type %1 for help - + 输入 %1 获取帮助 - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Could not add database %1 to list. - + 未能将数据库“%1”添加到列表。 - + closed - + 已关闭 @@ -39,7 +39,7 @@ Usage: %1%2 - + 用法: %1%2 @@ -47,12 +47,12 @@ Could not add database %1 to list. - + 未能将数据库“%1”添加到列表。 Database added: %1 - + 已添加数据库:%1 @@ -68,7 +68,7 @@ name CLI command syntax - + @@ -82,12 +82,12 @@ Changed directory to: %1 - + 已切换到:%1 Could not change directory to: %1 - + 未能切换到:%1 @@ -201,13 +201,65 @@ CliCommandDesc - - shows details about the table + + No working database is set. +Call %1 command to set working database. +Call %2 to see list of all databases. + + + + + Database is not open. - + + Cannot find table named: %1 + + + + + shows details about the table + 显示表的详情 + + + table + + + + + Table: %1 + + + + + Column name + + + + + Data type + + + + + Constraints + + + + + Virtual table: %1 + + + + + Construction arguments: + + + + + No construction arguments were passed for this virtual table. @@ -236,7 +288,7 @@ You can pass <pattern> with wildcard characters to filter output. quits the application - + 退出本程序 @@ -280,7 +332,7 @@ You can always execute any command with exactly single '--help' option Usage: %1%2 - + 用法: %1%2 @@ -399,7 +451,7 @@ The ROW mode is recommended if you need to see whole values and you don't e Could not add database %1 to list. - + 未能将数据库“%1”添加到列表。 @@ -632,7 +684,7 @@ The database argument is optional and if provided, then only given database will Current database: %1 - + 当前数据库:%1 -- cgit v1.2.3