mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-12-29 09:16:29 -05:00
Merge pull request #1725 from Throne3d/fix/1647-translations
Improve translation base strings
This commit is contained in:
commit
ed2da34d7a
@ -130,9 +130,9 @@ void BrowserOptionDialog::saveSettings()
|
|||||||
void BrowserOptionDialog::showProxyLocationFileDialog()
|
void BrowserOptionDialog::showProxyLocationFileDialog()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
QString fileTypeFilter(tr("Executable Files (*.exe);;All Files (*.*)"));
|
QString fileTypeFilter(QString("%1 (*.exe);;%2 (*.*)").arg(tr("Executable Files"), tr("All Files")));
|
||||||
#else
|
#else
|
||||||
QString fileTypeFilter(tr("Executable Files (*)"));
|
QString fileTypeFilter(QString("%1 (*)").arg(tr("Executable Files")));
|
||||||
#endif
|
#endif
|
||||||
auto proxyLocation = QFileDialog::getOpenFileName(this, tr("Select custom proxy location"),
|
auto proxyLocation = QFileDialog::getOpenFileName(this, tr("Select custom proxy location"),
|
||||||
QFileInfo(QCoreApplication::applicationDirPath()).filePath(),
|
QFileInfo(QCoreApplication::applicationDirPath()).filePath(),
|
||||||
|
@ -437,7 +437,7 @@ void BrowserService::removeSharedEncryptionKeys()
|
|||||||
|
|
||||||
if (keysToRemove.isEmpty()) {
|
if (keysToRemove.isEmpty()) {
|
||||||
QMessageBox::information(0, tr("KeePassXC: No keys found"),
|
QMessageBox::information(0, tr("KeePassXC: No keys found"),
|
||||||
tr("No shared encryption keys found in KeePassXC Settings."),
|
tr("No shared encryption keys found in KeePassXC settings."),
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ bool CsvParser::readFile(QFile *device) {
|
|||||||
m_array.replace("\r\n", "\n");
|
m_array.replace("\r\n", "\n");
|
||||||
m_array.replace("\r", "\n");
|
m_array.replace("\r", "\n");
|
||||||
if (0 == m_array.size())
|
if (0 == m_array.size())
|
||||||
appendStatusMsg(QObject::tr("file empty !\n"));
|
appendStatusMsg(QObject::tr("file empty").append("\n"));
|
||||||
m_isFileLoaded = true;
|
m_isFileLoaded = true;
|
||||||
}
|
}
|
||||||
return m_isFileLoaded;
|
return m_isFileLoaded;
|
||||||
@ -377,10 +377,8 @@ int CsvParser::getCsvRows() const {
|
|||||||
|
|
||||||
|
|
||||||
void CsvParser::appendStatusMsg(QString s, bool isCritical) {
|
void CsvParser::appendStatusMsg(QString s, bool isCritical) {
|
||||||
m_statusMsg += s
|
m_statusMsg += QObject::tr("%1: (row, col) %2,%3")
|
||||||
.append(": (row,col) " + QString::number(m_currRow))
|
.arg(s, m_currRow, m_currCol)
|
||||||
.append(",")
|
|
||||||
.append(QString::number(m_currCol))
|
|
||||||
.append("\n");
|
.append("\n");
|
||||||
m_isGood = !isCritical;
|
m_isGood = !isCritical;
|
||||||
}
|
}
|
||||||
|
@ -681,7 +681,7 @@ Entry* Entry::clone(CloneFlags flags) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & CloneRenameTitle)
|
if (flags & CloneRenameTitle)
|
||||||
entry->setTitle(entry->title() + tr(" - Clone", "Suffix added to cloned entries"));
|
entry->setTitle(tr("%1 - Clone").arg(entry->title()));
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
@ -616,7 +616,7 @@ QString Group::print(bool recursive, int depth)
|
|||||||
QString indentation = QString(" ").repeated(depth);
|
QString indentation = QString(" ").repeated(depth);
|
||||||
|
|
||||||
if (entries().isEmpty() && children().isEmpty()) {
|
if (entries().isEmpty() && children().isEmpty()) {
|
||||||
response += indentation + "[empty]\n";
|
response += indentation + tr("[empty]", "group has no children") + "\n";
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,7 +911,7 @@ void Group::markOlderEntry(Entry* entry)
|
|||||||
{
|
{
|
||||||
entry->attributes()->set(
|
entry->attributes()->set(
|
||||||
"merged",
|
"merged",
|
||||||
QString("older entry merged from database \"%1\"").arg(entry->group()->database()->metadata()->name()));
|
tr("older entry merged from database \"%1\"").arg(entry->group()->database()->metadata()->name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Group::resolveSearchingEnabled() const
|
bool Group::resolveSearchingEnabled() const
|
||||||
|
@ -42,7 +42,7 @@ Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea
|
|||||||
if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty()
|
if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty()
|
||||||
|| m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty()
|
|| m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty()
|
||||||
|| m_db->cipher().isNull()) {
|
|| m_db->cipher().isNull()) {
|
||||||
raiseError("missing database headers");
|
raiseError(tr("missing database headers"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea
|
|||||||
if (!xmlReader.headerHash().isEmpty()) {
|
if (!xmlReader.headerHash().isEmpty()) {
|
||||||
QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256);
|
QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256);
|
||||||
if (headerHash != xmlReader.headerHash()) {
|
if (headerHash != xmlReader.headerHash()) {
|
||||||
raiseError("Header doesn't match hash");
|
raiseError(tr("Header doesn't match hash"));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ bool Kdbx3Reader::readHeaderField(StoreDataStream& headerStream)
|
|||||||
{
|
{
|
||||||
QByteArray fieldIDArray = headerStream.read(1);
|
QByteArray fieldIDArray = headerStream.read(1);
|
||||||
if (fieldIDArray.size() != 1) {
|
if (fieldIDArray.size() != 1) {
|
||||||
raiseError("Invalid header id size");
|
raiseError(tr("Invalid header id size"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
char fieldID = fieldIDArray.at(0);
|
char fieldID = fieldIDArray.at(0);
|
||||||
@ -154,7 +154,7 @@ bool Kdbx3Reader::readHeaderField(StoreDataStream& headerStream)
|
|||||||
bool ok;
|
bool ok;
|
||||||
auto fieldLen = Endian::readSizedInt<quint16>(&headerStream, KeePass2::BYTEORDER, &ok);
|
auto fieldLen = Endian::readSizedInt<quint16>(&headerStream, KeePass2::BYTEORDER, &ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
raiseError("Invalid header field length");
|
raiseError(tr("Invalid header field length"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ bool Kdbx3Reader::readHeaderField(StoreDataStream& headerStream)
|
|||||||
if (fieldLen != 0) {
|
if (fieldLen != 0) {
|
||||||
fieldData = headerStream.read(fieldLen);
|
fieldData = headerStream.read(fieldLen);
|
||||||
if (fieldData.size() != fieldLen) {
|
if (fieldData.size() != fieldLen) {
|
||||||
raiseError("Invalid header data length");
|
raiseError(tr("Invalid header data length"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,9 @@ QString KdbxXmlReader::errorString() const
|
|||||||
{
|
{
|
||||||
if (m_error) {
|
if (m_error) {
|
||||||
return m_errorStr;
|
return m_errorStr;
|
||||||
}if (m_xml.hasError()) {
|
}
|
||||||
return QString("XML error:\n%1\nLine %2, column %3")
|
if (m_xml.hasError()) {
|
||||||
|
return tr("XML error:\n%1\nLine %2, column %3")
|
||||||
.arg(m_xml.errorString())
|
.arg(m_xml.errorString())
|
||||||
.arg(m_xml.lineNumber())
|
.arg(m_xml.lineNumber())
|
||||||
.arg(m_xml.columnNumber());
|
.arg(m_xml.columnNumber());
|
||||||
|
@ -363,7 +363,7 @@ SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const Q
|
|||||||
cipherStream->reset();
|
cipherStream->reset();
|
||||||
cipherStream->close();
|
cipherStream->close();
|
||||||
if (!m_device->seek(contentPos)) {
|
if (!m_device->seek(contentPos)) {
|
||||||
QString msg = "unable to seek to content position";
|
QString msg = tr("unable to seek to content position");
|
||||||
if (!m_device->errorString().isEmpty()) {
|
if (!m_device->errorString().isEmpty()) {
|
||||||
msg.append("\n").append(m_device->errorString());
|
msg.append("\n").append(m_device->errorString());
|
||||||
}
|
}
|
||||||
|
@ -53,9 +53,9 @@ AboutDialog::AboutDialog(QWidget* parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString debugInfo = "KeePassXC - ";
|
QString debugInfo = "KeePassXC - ";
|
||||||
debugInfo.append(tr("Version %1\n").arg(KEEPASSX_VERSION));
|
debugInfo.append(tr("Version %1").arg(KEEPASSX_VERSION).append("\n"));
|
||||||
#ifndef KEEPASSXC_BUILD_TYPE_RELEASE
|
#ifndef KEEPASSXC_BUILD_TYPE_RELEASE
|
||||||
debugInfo.append(tr("Build Type: %1\n").arg(KEEPASSXC_BUILD_TYPE));
|
debugInfo.append(tr("Build Type: %1").arg(KEEPASSXC_BUILD_TYPE).append("\n"));
|
||||||
#endif
|
#endif
|
||||||
if (!commitHash.isEmpty()) {
|
if (!commitHash.isEmpty()) {
|
||||||
debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n"));
|
debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n"));
|
||||||
@ -82,23 +82,23 @@ AboutDialog::AboutDialog(QWidget* parent)
|
|||||||
|
|
||||||
QString extensions;
|
QString extensions;
|
||||||
#ifdef WITH_XC_AUTOTYPE
|
#ifdef WITH_XC_AUTOTYPE
|
||||||
extensions += "\n- Auto-Type";
|
extensions += "\n- " + tr("Auto-Type");
|
||||||
#endif
|
#endif
|
||||||
#ifdef WITH_XC_BROWSER
|
#ifdef WITH_XC_BROWSER
|
||||||
extensions += "\n- Browser Integration";
|
extensions += "\n- " + tr("Browser Integration");
|
||||||
#endif
|
#endif
|
||||||
#ifdef WITH_XC_HTTP
|
#ifdef WITH_XC_HTTP
|
||||||
extensions += "\n- Legacy Browser Integration (KeePassHTTP)";
|
extensions += "\n- " + tr("Legacy Browser Integration (KeePassHTTP)");
|
||||||
#endif
|
#endif
|
||||||
#ifdef WITH_XC_SSHAGENT
|
#ifdef WITH_XC_SSHAGENT
|
||||||
extensions += "\n- SSH Agent";
|
extensions += "\n- " + tr("SSH Agent");
|
||||||
#endif
|
#endif
|
||||||
#ifdef WITH_XC_YUBIKEY
|
#ifdef WITH_XC_YUBIKEY
|
||||||
extensions += "\n- YubiKey";
|
extensions += "\n- " + tr("YubiKey");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (extensions.isEmpty())
|
if (extensions.isEmpty())
|
||||||
extensions = " None";
|
extensions = " " + tr("None");
|
||||||
|
|
||||||
debugInfo.append(tr("Enabled extensions:").append(extensions));
|
debugInfo.append(tr("Enabled extensions:").append(extensions));
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ void ChangeMasterKeyWidget::createKeyFile()
|
|||||||
QString errorMsg;
|
QString errorMsg;
|
||||||
bool created = FileKey::create(fileName, &errorMsg);
|
bool created = FileKey::create(fileName, &errorMsg);
|
||||||
if (!created) {
|
if (!created) {
|
||||||
m_ui->messageWidget->showMessage(tr("Unable to create Key File : ").append(errorMsg), MessageWidget::Error);
|
m_ui->messageWidget->showMessage(tr("Unable to create key file: %1").arg(errorMsg), MessageWidget::Error);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_ui->keyFileCombo->setEditText(fileName);
|
m_ui->keyFileCombo->setEditText(fileName);
|
||||||
@ -159,7 +159,7 @@ void ChangeMasterKeyWidget::generateKey()
|
|||||||
QString fileKeyName = m_ui->keyFileCombo->currentText();
|
QString fileKeyName = m_ui->keyFileCombo->currentText();
|
||||||
if (!fileKey.load(fileKeyName, &errorMsg)) {
|
if (!fileKey.load(fileKeyName, &errorMsg)) {
|
||||||
m_ui->messageWidget->showMessage(
|
m_ui->messageWidget->showMessage(
|
||||||
tr("Failed to set %1 as the Key file:\n%2").arg(fileKeyName, errorMsg), MessageWidget::Error);
|
tr("Failed to set %1 as the key file:\n%2").arg(fileKeyName, errorMsg), MessageWidget::Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (fileKey.type() != FileKey::Hashed) {
|
if (fileKey.type() != FileKey::Hashed) {
|
||||||
|
@ -214,7 +214,7 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
|
|||||||
QString keyFilename = m_ui->comboKeyFile->currentText();
|
QString keyFilename = m_ui->comboKeyFile->currentText();
|
||||||
QString errorMsg;
|
QString errorMsg;
|
||||||
if (!key.load(keyFilename, &errorMsg)) {
|
if (!key.load(keyFilename, &errorMsg)) {
|
||||||
m_ui->messageWidget->showMessage(tr("Can't open key file").append(":\n").append(errorMsg),
|
m_ui->messageWidget->showMessage(tr("Can't open key file:\n%1").arg(errorMsg),
|
||||||
MessageWidget::Error);
|
MessageWidget::Error);
|
||||||
return QSharedPointer<CompositeKey>();
|
return QSharedPointer<CompositeKey>();
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ void DatabaseRepairWidget::openDatabase()
|
|||||||
QString keyFilename = m_ui->comboKeyFile->currentText();
|
QString keyFilename = m_ui->comboKeyFile->currentText();
|
||||||
QString errorMsg;
|
QString errorMsg;
|
||||||
if (!key.load(keyFilename, &errorMsg)) {
|
if (!key.load(keyFilename, &errorMsg)) {
|
||||||
MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg));
|
MessageBox::warning(this, tr("Error"), tr("Can't open key file:\n%1").arg(errorMsg));
|
||||||
emit editFinished(false);
|
emit editFinished(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -181,8 +181,9 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
|
|||||||
|
|
||||||
void DatabaseTabWidget::importCsv()
|
void DatabaseTabWidget::importCsv()
|
||||||
{
|
{
|
||||||
|
QString filter = QString("%1 (*.csv);;%2 (*)").arg(tr("CSV file"), tr("All files"));
|
||||||
QString fileName = fileDialog()->getOpenFileName(this, tr("Open CSV file"), QString(),
|
QString fileName = fileDialog()->getOpenFileName(this, tr("Open CSV file"), QString(),
|
||||||
tr("CSV file") + " (*.csv);;" + tr("All files (*)"));
|
filter);
|
||||||
|
|
||||||
if (fileName.isEmpty()) {
|
if (fileName.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
@ -213,8 +214,9 @@ void DatabaseTabWidget::mergeDatabase(const QString& fileName)
|
|||||||
|
|
||||||
void DatabaseTabWidget::importKeePass1Database()
|
void DatabaseTabWidget::importKeePass1Database()
|
||||||
{
|
{
|
||||||
|
QString filter = QString("%1 (*.kdb);;%2 (*)").arg(tr("KeePass 1 database"), tr("All files"));
|
||||||
QString fileName = fileDialog()->getOpenFileName(this, tr("Open KeePass 1 database"), QString(),
|
QString fileName = fileDialog()->getOpenFileName(this, tr("Open KeePass 1 database"), QString(),
|
||||||
tr("KeePass 1 database") + " (*.kdb);;" + tr("All files (*)"));
|
filter);
|
||||||
|
|
||||||
if (fileName.isEmpty()) {
|
if (fileName.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
@ -532,12 +534,12 @@ void DatabaseTabWidget::updateTabName(Database* db)
|
|||||||
if (db->metadata()->name().isEmpty()) {
|
if (db->metadata()->name().isEmpty()) {
|
||||||
tabName = tr("New database");
|
tabName = tr("New database");
|
||||||
} else {
|
} else {
|
||||||
tabName = QString("%1 [%2]").arg(db->metadata()->name(), tr("New database"));
|
tabName = tr("%1 [New database]", "tab modifier").arg(db->metadata()->name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dbStruct.dbWidget->currentMode() == DatabaseWidget::LockedMode) {
|
if (dbStruct.dbWidget->currentMode() == DatabaseWidget::LockedMode) {
|
||||||
tabName.append(QString(" [%1]").arg(tr("locked")));
|
tabName = tr("%1 [locked]", "tab modifier").arg(tabName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dbStruct.modified) {
|
if (dbStruct.modified) {
|
||||||
|
@ -479,23 +479,21 @@ void DatabaseWidget::deleteEntries()
|
|||||||
|
|
||||||
bool inRecycleBin = Tools::hasChild(m_db->metadata()->recycleBin(), selectedEntries.first());
|
bool inRecycleBin = Tools::hasChild(m_db->metadata()->recycleBin(), selectedEntries.first());
|
||||||
if (inRecycleBin || !m_db->metadata()->recycleBinEnabled()) {
|
if (inRecycleBin || !m_db->metadata()->recycleBinEnabled()) {
|
||||||
QMessageBox::StandardButton result;
|
QString prompt;
|
||||||
|
|
||||||
if (selected.size() == 1) {
|
if (selected.size() == 1) {
|
||||||
result = MessageBox::question(
|
prompt = tr("Do you really want to delete the entry \"%1\" for good?")
|
||||||
this, tr("Delete entry?"),
|
.arg(selectedEntries.first()->title().toHtmlEscaped());
|
||||||
tr("Do you really want to delete the entry \"%1\" for good?")
|
|
||||||
.arg(selectedEntries.first()->title().toHtmlEscaped()),
|
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = MessageBox::question(
|
prompt = tr("Do you really want to delete %n entry(s) for good?", "", selected.size());
|
||||||
this, tr("Delete entries?"),
|
|
||||||
tr("Do you really want to delete %1 entries for good?")
|
|
||||||
.arg(selected.size()),
|
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMessageBox::StandardButton result = MessageBox::question(
|
||||||
|
this,
|
||||||
|
tr("Delete entry(s)?", "", selected.size()),
|
||||||
|
prompt,
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
|
||||||
if (result == QMessageBox::Yes) {
|
if (result == QMessageBox::Yes) {
|
||||||
for (Entry* entry : asConst(selectedEntries)) {
|
for (Entry* entry : asConst(selectedEntries)) {
|
||||||
delete entry;
|
delete entry;
|
||||||
@ -504,21 +502,19 @@ void DatabaseWidget::deleteEntries()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
QMessageBox::StandardButton result;
|
QString prompt;
|
||||||
|
|
||||||
if (selected.size() == 1) {
|
if (selected.size() == 1) {
|
||||||
result = MessageBox::question(
|
prompt = tr("Do you really want to move entry \"%1\" to the recycle bin?")
|
||||||
this, tr("Move entry to recycle bin?"),
|
.arg(selectedEntries.first()->title().toHtmlEscaped());
|
||||||
tr("Do you really want to move entry \"%1\" to the recycle bin?")
|
} else {
|
||||||
.arg(selectedEntries.first()->title().toHtmlEscaped()),
|
prompt = tr("Do you really want to move %n entry(s) to the recycle bin?", "", selected.size());
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
result = MessageBox::question(
|
QMessageBox::StandardButton result = MessageBox::question(
|
||||||
this, tr("Move entries to recycle bin?"),
|
this,
|
||||||
tr("Do you really want to move %n entry(s) to the recycle bin?", 0, selected.size()),
|
tr("Move entry(s) to recycle bin?", "", selected.size()),
|
||||||
|
prompt,
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
}
|
|
||||||
|
|
||||||
if (result == QMessageBox::No) {
|
if (result == QMessageBox::No) {
|
||||||
return;
|
return;
|
||||||
|
@ -216,7 +216,7 @@ void DetailsWidget::updateEntryAttributesTab()
|
|||||||
if (m_currentEntry->attributes()->isProtected(key)) {
|
if (m_currentEntry->attributes()->isProtected(key)) {
|
||||||
value = "<i>" + tr("[PROTECTED]") + "</i>";
|
value = "<i>" + tr("[PROTECTED]") + "</i>";
|
||||||
}
|
}
|
||||||
attributesText.append(QString("<b>%1</b>: %2<br/>").arg(key, value));
|
attributesText.append(tr("<b>%1</b>: %2", "attributes line").arg(key, value).append("<br/>"));
|
||||||
}
|
}
|
||||||
m_ui->entryAttributesEdit->setText(attributesText);
|
m_ui->entryAttributesEdit->setText(attributesText);
|
||||||
}
|
}
|
||||||
|
@ -305,9 +305,10 @@ void EditWidgetIcons::removeCustomIcon()
|
|||||||
int iconUseCount = entriesWithSameIcon.size() + groupsWithSameIcon.size();
|
int iconUseCount = entriesWithSameIcon.size() + groupsWithSameIcon.size();
|
||||||
if (iconUseCount > 0) {
|
if (iconUseCount > 0) {
|
||||||
QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Delete"),
|
QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Delete"),
|
||||||
tr("This icon is used by %1 entries, and will be replaced "
|
tr("This icon is used by %n entry(s), and will be replaced "
|
||||||
"by the default icon. Are you sure you want to delete it?")
|
"by the default icon. Are you sure you want to delete it?",
|
||||||
.arg(iconUseCount), QMessageBox::Yes | QMessageBox::No);
|
"", iconUseCount),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
|
||||||
if (ans == QMessageBox::No) {
|
if (ans == QMessageBox::No) {
|
||||||
// Early out, nothing is changed
|
// Early out, nothing is changed
|
||||||
|
@ -673,7 +673,7 @@ void MainWindow::updateWindowTitle()
|
|||||||
customWindowTitlePart.remove(customWindowTitlePart.size() - 1, 1);
|
customWindowTitlePart.remove(customWindowTitlePart.size() - 1, 1);
|
||||||
}
|
}
|
||||||
if (m_ui->tabWidget->readOnly(tabWidgetIndex)) {
|
if (m_ui->tabWidget->readOnly(tabWidgetIndex)) {
|
||||||
customWindowTitlePart.append(QString(" [%1]").arg(tr("read-only")));
|
customWindowTitlePart = tr("%1 [read-only]", "window title modifier").arg(customWindowTitlePart);
|
||||||
}
|
}
|
||||||
m_ui->actionDatabaseSave->setEnabled(m_ui->tabWidget->canSave(tabWidgetIndex));
|
m_ui->actionDatabaseSave->setEnabled(m_ui->tabWidget->canSave(tabWidgetIndex));
|
||||||
} else if (stackedWidgetIndex == 1) {
|
} else if (stackedWidgetIndex == 1) {
|
||||||
|
@ -47,7 +47,7 @@ SearchWidget::SearchWidget(QWidget* parent)
|
|||||||
m_ui->searchEdit->installEventFilter(this);
|
m_ui->searchEdit->installEventFilter(this);
|
||||||
|
|
||||||
QMenu* searchMenu = new QMenu();
|
QMenu* searchMenu = new QMenu();
|
||||||
m_actionCaseSensitive = searchMenu->addAction(tr("Case Sensitive"), this, SLOT(updateCaseSensitive()));
|
m_actionCaseSensitive = searchMenu->addAction(tr("Case sensitive"), this, SLOT(updateCaseSensitive()));
|
||||||
m_actionCaseSensitive->setObjectName("actionSearchCaseSensitive");
|
m_actionCaseSensitive->setObjectName("actionSearchCaseSensitive");
|
||||||
m_actionCaseSensitive->setCheckable(true);
|
m_actionCaseSensitive->setCheckable(true);
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ void TotpDialog::updateProgressBar()
|
|||||||
void TotpDialog::updateSeconds()
|
void TotpDialog::updateSeconds()
|
||||||
{
|
{
|
||||||
uint epoch = QDateTime::currentDateTime().toTime_t() - 1;
|
uint epoch = QDateTime::currentDateTime().toTime_t() - 1;
|
||||||
m_ui->timerLabel->setText(tr("Expires in") + " <b>" + QString::number(m_step - (epoch % m_step)) + "</b> " + tr("seconds"));
|
m_ui->timerLabel->setText(tr("Expires in <b>%n</b> second(s)", "", m_step - (epoch % m_step)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TotpDialog::updateTotp()
|
void TotpDialog::updateTotp()
|
||||||
|
@ -151,10 +151,10 @@ void CsvImportWidget::updatePreview() {
|
|||||||
if (m_ui->checkBoxFieldNames->isChecked()) {
|
if (m_ui->checkBoxFieldNames->isChecked()) {
|
||||||
columnName = m_parserModel->getCsvTable().at(0).at(i);
|
columnName = m_parserModel->getCsvTable().at(0).at(i);
|
||||||
if (columnName.isEmpty())
|
if (columnName.isEmpty())
|
||||||
columnName = "<" + tr("Empty fieldname ") + QString::number(++emptyId) + ">";
|
columnName = "<" + tr("Empty fieldname %1").arg(++emptyId) + ">";
|
||||||
list << columnName;
|
list << columnName;
|
||||||
} else {
|
} else {
|
||||||
list << QString(tr("column ")) + QString::number(i);
|
list << QString(tr("column %1").arg(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_comboModel->setStringList(list);
|
m_comboModel->setStringList(list);
|
||||||
@ -176,7 +176,7 @@ void CsvImportWidget::load(const QString& filename, Database* const db) {
|
|||||||
m_ui->labelFilename->setText(filename);
|
m_ui->labelFilename->setText(filename);
|
||||||
Group* group = m_db->rootGroup();
|
Group* group = m_db->rootGroup();
|
||||||
group->setUuid(Uuid::random());
|
group->setUuid(Uuid::random());
|
||||||
group->setNotes(tr("Imported from CSV file").append("\n").append(tr("Original data: ")) + filename);
|
group->setNotes(tr("Imported from CSV file\nOriginal data: %1").arg(filename));
|
||||||
parse();
|
parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,8 +201,8 @@ QString CsvImportWidget::formatStatusText() const {
|
|||||||
int items = text.count('\n');
|
int items = text.count('\n');
|
||||||
if (items > 2) {
|
if (items > 2) {
|
||||||
return text.section('\n', 0, 1)
|
return text.section('\n', 0, 1)
|
||||||
.append("\n[").append(QString::number(items - 2))
|
.append("\n")
|
||||||
.append(tr(" more messages skipped]"));
|
.append(tr("[%n more message(s) skipped]", "", items - 2));
|
||||||
}
|
}
|
||||||
if (items == 1) {
|
if (items == 1) {
|
||||||
text.append(QString("\n"));
|
text.append(QString("\n"));
|
||||||
@ -247,8 +247,8 @@ void CsvImportWidget::writeDatabase() {
|
|||||||
KeePass2Writer writer;
|
KeePass2Writer writer;
|
||||||
writer.writeDatabase(&buffer, m_db);
|
writer.writeDatabase(&buffer, m_db);
|
||||||
if (writer.hasError())
|
if (writer.hasError())
|
||||||
MessageBox::warning(this, tr("Error"), tr("CSV import: writer has errors:\n")
|
MessageBox::warning(this, tr("Error"), tr("CSV import: writer has errors:\n%1")
|
||||||
.append((writer.errorString())), QMessageBox::Ok, QMessageBox::Ok);
|
.arg(writer.errorString()), QMessageBox::Ok, QMessageBox::Ok);
|
||||||
emit editFinished(true);
|
emit editFinished(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,9 +31,10 @@ void CsvParserModel::setFilename(const QString& filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString CsvParserModel::getFileInfo(){
|
QString CsvParserModel::getFileInfo(){
|
||||||
QString a(tr("%n byte(s), ", nullptr, getFileSize()));
|
QString a(tr("%1, %2, %3", "file info: bytes, rows, columns")
|
||||||
a.append(tr("%n row(s), ", nullptr, getCsvRows()));
|
.arg(tr("%n byte(s)", nullptr, getFileSize()))
|
||||||
a.append(tr("%n column(s)", nullptr, qMax(0, getCsvCols() - 1)));
|
.arg(tr("%n row(s)", nullptr, getCsvRows()))
|
||||||
|
.arg(tr("%n column(s)", nullptr, qMax(0, getCsvCols() - 1))));
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -916,7 +916,7 @@ void EditEntryWidget::insertAttribute()
|
|||||||
int i = 1;
|
int i = 1;
|
||||||
|
|
||||||
while (m_entryAttributes->keys().contains(name)) {
|
while (m_entryAttributes->keys().contains(name)) {
|
||||||
name = QString("%1 %2").arg(tr("New attribute")).arg(i);
|
name = tr("New attribute %1").arg(i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -979,7 +979,7 @@ void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected)
|
|||||||
if (index.isValid()) {
|
if (index.isValid()) {
|
||||||
QString key = m_attributesModel->keyByIndex(index);
|
QString key = m_attributesModel->keyByIndex(index);
|
||||||
if (showProtected) {
|
if (showProtected) {
|
||||||
m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED]") + " " + tr("Press reveal to view or edit"));
|
m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED] Press reveal to view or edit"));
|
||||||
m_advancedUi->attributesEdit->setEnabled(false);
|
m_advancedUi->attributesEdit->setEnabled(false);
|
||||||
m_advancedUi->revealAttributeButton->setEnabled(true);
|
m_advancedUi->revealAttributeButton->setEnabled(true);
|
||||||
m_advancedUi->protectAttributeButton->setChecked(true);
|
m_advancedUi->protectAttributeButton->setChecked(true);
|
||||||
|
@ -162,7 +162,7 @@ void EntryAttachmentsWidget::removeSelectedAttachments()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const QString question = tr("Are you sure you want to remove %n attachment(s)?", "", indexes.count());
|
const QString question = tr("Are you sure you want to remove %n attachment(s)?", "", indexes.count());
|
||||||
QMessageBox::StandardButton answer = MessageBox::question(this, tr("Confirm Remove"),
|
QMessageBox::StandardButton answer = MessageBox::question(this, tr("Confirm remove"),
|
||||||
question, QMessageBox::Yes | QMessageBox::No);
|
question, QMessageBox::Yes | QMessageBox::No);
|
||||||
if (answer == QMessageBox::Yes) {
|
if (answer == QMessageBox::Yes) {
|
||||||
QStringList keys;
|
QStringList keys;
|
||||||
|
Loading…
Reference in New Issue
Block a user