From 9b659f2c8f3ec05fa4a33a606b560c66c71dc1e1 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 16 May 2016 21:01:01 +0200 Subject: [PATCH] Fix minor bugs in HTML info and cover selection Additionally, the buttons of the cover selections can now be hidden. --- application/settings.cpp | 7 + application/settings.h | 1 + gui/editorfieldsoptionpage.ui | 2 +- gui/editorgeneraloptionpage.ui | 15 +- gui/fileinfomodel.cpp | 2 +- gui/picturepreviewselection.cpp | 207 ++++++---- gui/picturepreviewselection.h | 3 + gui/picturepreviewselection.ui | 5 +- gui/settingsdialog.cpp | 2 + gui/tagedit.cpp | 10 + gui/tagedit.h | 1 + gui/tageditorwidget.cpp | 2 + gui/tagfieldedit.cpp | 10 + gui/tagfieldedit.h | 1 + misc/htmlinfo.cpp | 2 +- translations/tageditor_de_DE.ts | 654 ++++++++++++++++---------------- translations/tageditor_en_US.ts | 654 ++++++++++++++++---------------- 17 files changed, 848 insertions(+), 730 deletions(-) diff --git a/application/settings.cpp b/application/settings.cpp index c443453..35c17a7 100644 --- a/application/settings.cpp +++ b/application/settings.cpp @@ -52,6 +52,11 @@ bool &noWebView() return v; } #endif +bool &hideCoverButtons() +{ + static bool v = false; + return v; +} // file browser bool &hideBackupFiles() @@ -313,6 +318,7 @@ void restore() fixUmlauts() = settings.value(QStringLiteral("fixumlauts"), false).toBool(); settings.endGroup(); BackupHelper::backupDirectory() = settings.value(QStringLiteral("tempdir")).toString().toStdString(); + Settings::hideCoverButtons() = settings.value(QStringLiteral("hidecoverbtn"), false).toBool(); settings.endGroup(); selectedFieldsModel().restore(settings, QStringLiteral("selectedfields")); @@ -445,6 +451,7 @@ void save() settings.setValue(QStringLiteral("fixumlauts"), Settings::fixUmlauts()); settings.endGroup(); settings.setValue(QStringLiteral("tempdir"), QString::fromStdString(BackupHelper::backupDirectory())); + settings.setValue(QStringLiteral("hidecoverbtn"), Settings::hideCoverButtons()); settings.endGroup(); selectedFieldsModel().save(settings, QStringLiteral("selectedfields")); diff --git a/application/settings.h b/application/settings.h index 34721bf..a86ac10 100644 --- a/application/settings.h +++ b/application/settings.h @@ -46,6 +46,7 @@ bool &forceFullParse(); #ifndef TAGEDITOR_NO_WEBVIEW bool &noWebView(); #endif +bool &hideCoverButtons(); // file browser bool &hideBackupFiles(); diff --git a/gui/editorfieldsoptionpage.ui b/gui/editorfieldsoptionpage.ui index c614d02..eb47c0a 100644 --- a/gui/editorfieldsoptionpage.ui +++ b/gui/editorfieldsoptionpage.ui @@ -15,7 +15,7 @@ - + font-weight: bold; diff --git a/gui/editorgeneraloptionpage.ui b/gui/editorgeneraloptionpage.ui index 54da5ab..f1e0c62 100644 --- a/gui/editorgeneraloptionpage.ui +++ b/gui/editorgeneraloptionpage.ui @@ -2,14 +2,6 @@ QtGui::EditorGeneralOptionPage - - - 0 - 0 - 468 - 374 - - General @@ -106,6 +98,13 @@ + + + + Hide cover buttons + + + diff --git a/gui/fileinfomodel.cpp b/gui/fileinfomodel.cpp index a8d8bb0..7919e5b 100644 --- a/gui/fileinfomodel.cpp +++ b/gui/fileinfomodel.cpp @@ -365,7 +365,7 @@ void FileInfoModel::updateCache() trackHelper.appendRow(tr("Type"), track->mediaTypeName()); const char *fmtName = track->formatName(), *fmtAbbr = track->formatAbbreviation(); trackHelper.appendRow(tr("Format"), fmtName); - if(strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ + if(track->format() != GeneralMediaFormat::Unknown && strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ trackHelper.appendRow(tr("Abbreviation"), fmtAbbr); } if(track->version()) { diff --git a/gui/picturepreviewselection.cpp b/gui/picturepreviewselection.cpp index dde2998..46c2f1c 100644 --- a/gui/picturepreviewselection.cpp +++ b/gui/picturepreviewselection.cpp @@ -26,9 +26,13 @@ #include #include #include +#include +#include +#include #include #include +#include using namespace std; using namespace Media; @@ -50,11 +54,13 @@ PicturePreviewSelection::PicturePreviewSelection(Tag *tag, KnownField field, QWi m_currentTypeIndex(0) { m_ui->setupUi(this); + m_ui->coverButtonsWidget->setHidden(Settings::hideCoverButtons()); connect(m_ui->addButton, &QPushButton::clicked, this, static_cast(&PicturePreviewSelection::addOfSelectedType)); connect(m_ui->removeButton, &QPushButton::clicked, this, &PicturePreviewSelection::removeSelected); connect(m_ui->extractButton, &QPushButton::clicked, this, &PicturePreviewSelection::extractSelected); connect(m_ui->displayButton, &QPushButton::clicked, this, &PicturePreviewSelection::displaySelected); connect(m_ui->restoreButton, &QPushButton::clicked, std::bind(&PicturePreviewSelection::setup, this, PreviousValueHandling::Clear)); + connect(m_ui->previewGraphicsView, &QGraphicsView::customContextMenuRequested, this, &PicturePreviewSelection::showContextMenu); setup(); setAcceptDrops(true); } @@ -70,16 +76,15 @@ PicturePreviewSelection::~PicturePreviewSelection() */ void PicturePreviewSelection::setValue(const TagValue &value, PreviousValueHandling previousValueHandling) { - if(m_currentTypeIndex < static_cast(m_values.count())) { - TagValue ¤tValue = m_values[m_currentTypeIndex]; - if(previousValueHandling == PreviousValueHandling::Clear || !value.isEmpty()) { - if(previousValueHandling != PreviousValueHandling::Keep || currentValue.isEmpty()) { - currentValue = value; // TODO: move(value); - emit pictureChanged(); - } + assert(m_currentTypeIndex < static_cast(m_values.size())); + TagValue ¤tValue = m_values[m_currentTypeIndex]; + if(previousValueHandling == PreviousValueHandling::Clear || !value.isEmpty()) { + if(previousValueHandling != PreviousValueHandling::Keep || currentValue.isEmpty()) { + currentValue = value; // TODO: move(value); + emit pictureChanged(); } - updatePreview(m_currentTypeIndex); } + updatePreview(m_currentTypeIndex); } /*! @@ -164,7 +169,7 @@ void PicturePreviewSelection::setup(PreviousValueHandling previousValueHandling) << tr("Illustration") << tr("Band/artist logotype") << tr("Publisher/Studio logotype") - ); + ); } int first; switch(m_tag->type()) { @@ -172,6 +177,7 @@ void PicturePreviewSelection::setup(PreviousValueHandling previousValueHandling) first = fetchId3v2CoverValues(static_cast(m_tag), m_field, m_values, m_ui->switchTypeComboBox->count(), previousValueHandling); break; case TagType::VorbisComment: + case TagType::OggVorbisComment: first = fetchId3v2CoverValues(static_cast(m_tag), m_field, m_values, m_ui->switchTypeComboBox->count(), previousValueHandling); break; default: @@ -224,9 +230,9 @@ template void pushId3v2CoverValues(TagType *tag, KnownField field, const QList &values) { auto &fields = tag->fields(); - auto id = tag->fieldId(field); - auto range = fields.equal_range(id); - auto first = range.first; + const auto id = tag->fieldId(field); + const auto range = fields.equal_range(id); + const auto first = range.first; // iterate through all tag values for(unsigned int index = 0, valueCount = values.size(); index < valueCount; ++index) { // check whether there is already a tag value with the current index/type @@ -236,11 +242,10 @@ void pushId3v2CoverValues(TagType *tag, KnownField field, const QList update this value pair->second.setValue(values[index]); // check whether there are more values with the current index/type assigned - while((pair = find_if(++first, range.second, std::bind(fieldPredicate, index, placeholders::_1))) != range.second) { + while((pair = find_if(++pair, range.second, std::bind(fieldPredicate, index, placeholders::_1))) != range.second) { // -> remove these values as we only support one value of a type in the same tag pair->second.setValue(TagValue()); } - first = range.first; // reset the first value } else if(!values[index].isEmpty()) { typename TagType::fieldType field(id, values[index]); field.setTypeInfo(index); @@ -293,13 +298,10 @@ void PicturePreviewSelection::clear() */ void PicturePreviewSelection::addOfSelectedType() { - if(m_currentTypeIndex < static_cast(m_values.count())) { - QString path = QFileDialog::getOpenFileName(this, tr("Select a picture to add as cover")); - if(!path.isEmpty()) { - addOfSelectedType(path); - } - } else { - throw logic_error("Invalid type selected (no corresponding value assigned)."); + assert(m_currentTypeIndex < static_cast(m_values.size())); + QString path = QFileDialog::getOpenFileName(this, tr("Select a picture to add as cover")); + if(!path.isEmpty()) { + addOfSelectedType(path); } } @@ -308,6 +310,7 @@ void PicturePreviewSelection::addOfSelectedType() */ void PicturePreviewSelection::addOfSelectedType(const QString &path) { + assert(m_currentTypeIndex < static_cast(m_values.size())); TagValue &selectedCover = m_values[m_currentTypeIndex]; try { MediaFileInfo fileInfo(path.toLocal8Bit().constData()); @@ -340,7 +343,7 @@ void PicturePreviewSelection::addOfSelectedType(const QString &path) */ void PicturePreviewSelection::removeSelected() { - if(m_currentTypeIndex < static_cast(m_values.count())) { + if(m_currentTypeIndex < static_cast(m_values.size())) { if(m_values[m_currentTypeIndex].isEmpty()) { QMessageBox::information(this, QApplication::applicationName(), tr("There is no cover to remove.")); } else { @@ -358,28 +361,25 @@ void PicturePreviewSelection::removeSelected() */ void PicturePreviewSelection::extractSelected() { - if(m_currentTypeIndex < static_cast(m_values.count())) { - TagValue &value = m_values[m_currentTypeIndex]; - if(value.isEmpty()) { - QMessageBox::information(this, QApplication::applicationName(), tr("There is no image attached to be extracted.")); - } else { - const auto path = QFileDialog::getSaveFileName(this, tr("Where do you want to save the cover?")); - if(!path.isEmpty()) { - QFile file(path); - if(file.open(QIODevice::WriteOnly)) { - if(file.write(value.dataPointer(), value.dataSize()) > 0) { - QMessageBox::information(this, QApplication::applicationName(), tr("The cover has extracted.")); - } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to write to output file.")); - } - file.close(); + assert(m_currentTypeIndex < static_cast(m_values.size())); + TagValue &value = m_values[m_currentTypeIndex]; + if(value.isEmpty()) { + QMessageBox::information(this, QApplication::applicationName(), tr("There is no image attached to be extracted.")); + } else { + const auto path = QFileDialog::getSaveFileName(this, tr("Where do you want to save the cover?")); + if(!path.isEmpty()) { + QFile file(path); + if(file.open(QIODevice::WriteOnly)) { + if(file.write(value.dataPointer(), value.dataSize()) > 0) { + QMessageBox::information(this, QApplication::applicationName(), tr("The cover has extracted.")); } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to open output file.")); + QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to write to output file.")); } + file.close(); + } else { + QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to open output file.")); } } - } else { - throw logic_error("Invalid type selected (no corresponding value assigned)."); } } @@ -388,46 +388,67 @@ void PicturePreviewSelection::extractSelected() */ void PicturePreviewSelection::displaySelected() { - if(m_currentTypeIndex < static_cast(m_values.count())) { - TagValue &value = m_values[m_currentTypeIndex]; - if(!value.isEmpty()) { - QImage img; - if(value.mimeType() == "-->") { - QFile file(Utility::stringToQString(value.toString(), value.dataEncoding())); - if(file.open(QFile::ReadOnly)) { - img = QImage::fromData(file.readAll()); - } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be found.")); - return; - } + assert(m_currentTypeIndex < static_cast(m_values.size())); + TagValue &value = m_values[m_currentTypeIndex]; + if(!value.isEmpty()) { + QImage img; + if(value.mimeType() == "-->") { + QFile file(Utility::stringToQString(value.toString(), value.dataEncoding())); + if(file.open(QFile::ReadOnly)) { + img = QImage::fromData(file.readAll()); } else { - img = QImage::fromData(reinterpret_cast(value.dataPointer()), value.dataSize()); - } - if(img.isNull()) { - QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be displayed.")); - } else { - QDialog dlg; - dlg.setWindowFlags(Qt::Tool); - dlg.setWindowTitle(tr("Cover - %1").arg(QApplication::applicationName())); - QBoxLayout layout(QBoxLayout::Up); - layout.setMargin(0); - QGraphicsView view(&dlg); - QGraphicsScene scene; - layout.addWidget(&view); - scene.addItem(new QGraphicsPixmapItem(QPixmap::fromImage(img))); - view.setScene(&scene); - view.show(); - dlg.setLayout(&layout); - dlg.exec(); + QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be found.")); + return; } } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("There is no image attached.")); + img = QImage::fromData(reinterpret_cast(value.dataPointer()), value.dataSize()); + } + if(img.isNull()) { + QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be displayed.")); + } else { + QDialog dlg; + dlg.setWindowFlags(Qt::Tool); + dlg.setWindowTitle(tr("Cover - %1").arg(QApplication::applicationName())); + QBoxLayout layout(QBoxLayout::Up); + layout.setMargin(0); + QGraphicsView view(&dlg); + QGraphicsScene scene; + layout.addWidget(&view); + scene.addItem(new QGraphicsPixmapItem(QPixmap::fromImage(img))); + view.setScene(&scene); + view.show(); + dlg.setLayout(&layout); + dlg.exec(); } } else { - throw logic_error("Invalid type selected (no corresponding value assigned)."); + QMessageBox::warning(this, QApplication::applicationName(), tr("There is no image attached.")); } } +/*! + * \brief Asks the user to alter the MIME-type of the selected cover. + */ +void PicturePreviewSelection::changeMimeTypeOfSelected() +{ + assert(m_currentTypeIndex < static_cast(m_values.size())); + TagValue &selectedCover = m_values[m_currentTypeIndex]; + auto mimeType = QString::fromLocal8Bit(selectedCover.mimeType().data()); + bool ok; + mimeType = QInputDialog::getText(this, tr("Enter/confirm mime type"), tr("Confirm or enter the mime type of the selected file."), QLineEdit::Normal, mimeType, &ok); + if(ok) { + selectedCover.setMimeType(mimeType.toLocal8Bit().data()); + } + +} + +/*! + * \brief Sets whether cover buttons are hidden. + */ +void PicturePreviewSelection::setCoverButtonsHidden(bool hideCoverButtons) +{ + m_ui->coverButtonsWidget->setHidden(hideCoverButtons); +} + void PicturePreviewSelection::changeEvent(QEvent *event) { switch(event->type()) { @@ -499,11 +520,9 @@ void PicturePreviewSelection::dropEvent(QDropEvent *event) */ void PicturePreviewSelection::typeSwitched(int index) { - if(m_currentTypeIndex >= static_cast(m_values.count())) { - throw logic_error("current type index is invalid"); - } + assert(m_currentTypeIndex < static_cast(m_values.size())); int lastIndex = m_currentTypeIndex; - if(index < 0 || index >= m_values.count()) { + if(index < 0 || index >= m_values.size()) { throw logic_error("current type index is invalid"); } else { m_currentTypeIndex = static_cast(index); @@ -600,4 +619,40 @@ void PicturePreviewSelection::updatePreview(int index) m_rectItem->setRect(0, 0, m_ui->previewGraphicsView->width(), m_ui->previewGraphicsView->height()); } +void PicturePreviewSelection::showContextMenu() +{ + QMenu menu; + QAction *addAction = menu.addAction(m_ui->addButton->text()); + addAction->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); + connect(addAction, &QAction::triggered, this, static_cast(&PicturePreviewSelection::addOfSelectedType)); + if(m_ui->extractButton->isEnabled()) { + QAction *mimeAction = menu.addAction(tr("Change MIME-type")); + mimeAction->setIcon(QIcon::fromTheme(QStringLiteral("document-properties"))); + connect(mimeAction, &QAction::triggered, this, &PicturePreviewSelection::changeMimeTypeOfSelected); + } + menu.addSeparator(); + if(m_ui->removeButton->isEnabled()) { + QAction *removeAction = menu.addAction(m_ui->removeButton->text()); + removeAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete"))); + connect(removeAction, &QAction::triggered, this, &PicturePreviewSelection::removeSelected); + } + if(m_ui->restoreButton->isEnabled()) { + QAction *restoreAction = menu.addAction(m_ui->restoreButton->text()); + restoreAction->setIcon(QIcon::fromTheme(QStringLiteral("document-revert"))); + connect(restoreAction, &QAction::triggered, std::bind(&PicturePreviewSelection::setup, this, PreviousValueHandling::Clear)); + } + menu.addSeparator(); + if(m_ui->extractButton->isEnabled()) { + QAction *extractAction = menu.addAction(m_ui->extractButton->text()); + extractAction->setIcon(QIcon::fromTheme(QStringLiteral("document-save"))); + connect(extractAction, &QAction::triggered, this, &PicturePreviewSelection::extractSelected); + } + if(m_ui->displayButton->isEnabled()) { + QAction *displayAction = menu.addAction(m_ui->displayButton->text()); + displayAction->setIcon(QIcon::fromTheme(QStringLiteral("image-x-generic"))); + connect(displayAction, &QAction::triggered, this, &PicturePreviewSelection::displaySelected); + } + menu.exec(QCursor::pos()); +} + } diff --git a/gui/picturepreviewselection.h b/gui/picturepreviewselection.h index 9e6e1f8..99b4562 100644 --- a/gui/picturepreviewselection.h +++ b/gui/picturepreviewselection.h @@ -51,6 +51,8 @@ public slots: void removeSelected(); void extractSelected(); void displaySelected(); + void changeMimeTypeOfSelected(); + void setCoverButtonsHidden(bool hideCoverButtons); signals: void pictureChanged(); @@ -66,6 +68,7 @@ private slots: void updateDescription(int newIndex); void updateDescription(int lastIndex, int newIndex); void updatePreview(int index); + void showContextMenu(); private: void setup(PreviousValueHandling previousValueHandling = PreviousValueHandling::Clear); diff --git a/gui/picturepreviewselection.ui b/gui/picturepreviewselection.ui index b9cb628..7f633cc 100644 --- a/gui/picturepreviewselection.ui +++ b/gui/picturepreviewselection.ui @@ -7,7 +7,7 @@ 0 0 284 - 230 + 242 @@ -100,6 +100,9 @@ 170 + + Qt::CustomContextMenu + Qt::ScrollBarAlwaysOff diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index 4c75547..15d97ac 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -73,6 +73,7 @@ bool EditorGeneralOptionPage::apply() saveAndShowNextOnEnter() = ui()->nextWhenPressingEnterCheckBox->isChecked(); askBeforeDeleting() = ui()->askBeforeDeletingCheckBox->isChecked(); hideTagSelectionComboBox() = ui()->hideTagSelectionComboBoxCheckBox->isChecked(); + hideCoverButtons() = ui()->hideCoverButtonsCheckBox->isChecked(); } return true; } @@ -102,6 +103,7 @@ void EditorGeneralOptionPage::reset() ui()->nextWhenPressingEnterCheckBox->setChecked(saveAndShowNextOnEnter()); ui()->askBeforeDeletingCheckBox->setChecked(askBeforeDeleting()); ui()->hideTagSelectionComboBoxCheckBox->setChecked(hideTagSelectionComboBox()); + ui()->hideCoverButtonsCheckBox->setChecked(hideCoverButtons()); } } diff --git a/gui/tagedit.cpp b/gui/tagedit.cpp index 7da508e..dd40f4e 100644 --- a/gui/tagedit.cpp +++ b/gui/tagedit.cpp @@ -211,6 +211,16 @@ void TagEdit::invalidate() setupUi(); } +/*! + * \brief Sets whether cover buttons are hidden. + */ +void TagEdit::setCoverButtonsHidden(bool hideCoverButtons) +{ + for(auto i = m_widgets.begin(), end = m_widgets.end(); i != end; ++i) { + i.value()->setCoverButtonsHidden(hideCoverButtons); + } +} + /*! * \brief Internally called to setup the UI. */ diff --git a/gui/tagedit.h b/gui/tagedit.h index 2a3e3a7..43bf561 100644 --- a/gui/tagedit.h +++ b/gui/tagedit.h @@ -48,6 +48,7 @@ public slots: void restore(); void apply(); void invalidate(); + void setCoverButtonsHidden(bool hideCoverButtons); signals: void returnPressed(); diff --git a/gui/tageditorwidget.cpp b/gui/tageditorwidget.cpp index b0ba9a5..5e6f7ae 100644 --- a/gui/tageditorwidget.cpp +++ b/gui/tageditorwidget.cpp @@ -50,6 +50,7 @@ #include using namespace std; +using namespace std::placeholders; using namespace Utility; using namespace Dialogs; using namespace Widgets; @@ -1223,6 +1224,7 @@ void TagEditorWidget::applySettingsFromDialog() break; } m_ui->actionManage_tags_automatically_when_loading_file->setChecked(Settings::autoTagManagement()); + foreachTagEdit(bind(&TagEdit::setCoverButtonsHidden, _1, Settings::hideCoverButtons())); // ensure info view is displayed/not displayed according to settings initInfoView(); updateInfoView(); diff --git a/gui/tagfieldedit.cpp b/gui/tagfieldedit.cpp index d37c9a9..df38e5b 100644 --- a/gui/tagfieldedit.cpp +++ b/gui/tagfieldedit.cpp @@ -212,6 +212,16 @@ bool TagFieldEdit::canApply(KnownField field) const return false; } +/*! + * \brief Sets whether the cover buttons are hidden. + */ +void TagFieldEdit::setCoverButtonsHidden(bool hideCoverButtons) +{ + if(m_pictureSelection) { + m_pictureSelection->setCoverButtonsHidden(hideCoverButtons); + } +} + /*! * \brief Internally called to determine the data type of the current tag field. */ diff --git a/gui/tagfieldedit.h b/gui/tagfieldedit.h index 5b60006..b87ed6f 100644 --- a/gui/tagfieldedit.h +++ b/gui/tagfieldedit.h @@ -53,6 +53,7 @@ public slots: void clear(); void apply(); void restore(); + void setCoverButtonsHidden(bool hideCoverButtons); signals: void returnPressed(); diff --git a/misc/htmlinfo.cpp b/misc/htmlinfo.cpp index 7191975..3a4fe32 100644 --- a/misc/htmlinfo.cpp +++ b/misc/htmlinfo.cpp @@ -512,7 +512,7 @@ public: rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Type"), qstr(track->mediaTypeName())); const char *fmtName = track->formatName(), *fmtAbbr = track->formatAbbreviation(); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Format"), QCoreApplication::translate("HtmlInfo", "The unabbreviated name of the track's format."), qstr(fmtName)); - if(strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ + if(track->format() != GeneralMediaFormat::Unknown && strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Abbreviation"), QCoreApplication::translate("HtmlInfo", "The abbreviated name of the track's format."), qstr(fmtAbbr)); } if(track->version()) { diff --git a/translations/tageditor_de_DE.ts b/translations/tageditor_de_DE.ts index e49a77b..474c2bf 100644 --- a/translations/tageditor_de_DE.ts +++ b/translations/tageditor_de_DE.ts @@ -852,62 +852,67 @@ Remarks QtGui::EditorGeneralOptionPage - + Keep field values from previously shown file when the value of the opened file is empty - + No, disable this feature - + Handling of multiple tags - + Yes, but only if both files are in the sa&me directory - + Yes, &regardless where the files are stored - + Use one editor for ta&gs with the same target - + Use always se&parate editors - + Miscellaneous - + Save changings and open next file when pressing enter - + Ask before deleting all tags - + Hide tag selection combo box when not needed - + + Hide cover buttons + + + + General @@ -925,7 +930,7 @@ Remarks - + To avoid unnecessary copying this directory should be on the same partition as the files you want to edit. @@ -1522,12 +1527,12 @@ another position would prevent rewriting the entire file - + Minimum padding must be less or equal than maximum padding. - + These options might be ignored if not supported by either the format or the implementation. @@ -2014,28 +2019,28 @@ another position would prevent rewriting the entire file - - + + Add - + Remove - + Extract - + Display - + Restore @@ -2046,173 +2051,175 @@ another position would prevent rewriting the entire file - + Other - + 32x32 File icon - + Other file icon - + Cover (front) - + Cover (back) - + Leaflet page - + Media (e. g. label side of CD) - + Lead artist/performer/soloist - + Artist/performer - + Conductor - + Band/Orchestra - + Composer - + Lyricist/text writer - + Recording Location - + During recording - + During performance - + Movie/video screen capture - + A bright coloured fish - + Illustration - + Band/artist logotype - + Publisher/Studio logotype - + Select a picture to add as cover - + + Enter/confirm mime type - + + Confirm or enter the mime type of the selected file. - + The selected file is very large (for a cover). Do you want to continue? - + An IO error occured when parsing the specified cover file. - + Unable to parse specified cover file. - + There is no cover to remove. - + There is no image attached to be extracted. - + Where do you want to save the cover? - + The cover has extracted. - + Unable to write to output file. - + Unable to open output file. - + The attached image can't be found. @@ -2232,20 +2239,25 @@ another position would prevent rewriting the entire file - + No image (of the selected type) attached. - + Unable to display attached image. - + Change + + + Change MIME-type + + QtGui::QueryResultsModel @@ -2536,17 +2548,17 @@ Error in line %1: %3 - + Tag processing - + Editor - + File browser @@ -2638,7 +2650,7 @@ the file reverting all unsaved changings. - + Abort @@ -2703,203 +2715,203 @@ the file reverting all unsaved changings. - + Add tag - + Remove tag - + Change target - + Segment %1 - + Attachments - + Matroska tag - + MP4/iTunes tag - + Tag - + ID3v1 tag - + ID3v2 tag - - + + Copy - + Unable to load the selected file "%1" because the current process hasn't finished yet. - + The file is beeing parsed ... - + Unable to reload the file because the current process hasn't finished yet. - + Currently is not file opened. - + The file could not be opened because an IO error occurred. - + File could be parsed correctly. - + File couldn't be parsed correctly. - + There are critical parsing notifications. - + There are warnings. - + There is no (supported) tag assigned. - + File format is not supported (an ID3 tag can be added anyways). - + The file %1 has been opened. - + Unable to apply the entered tags to the file because the current process hasn't finished yet. - + Saving tags ... - + No file has been opened. - + Unable to delete all tags from the file because the current process hasn't been finished yet. - + Do you really want to delete all tags from the file? - + don't show this message again - + Deleting all tags ... - + The selected file stores no tag (at least no supported), so there is nothing to delete. - + No file has been opened, so no tags can be deleted. - + Unable to start saving process because there an other process hasn't finished yet. - + Cancelling ... - + Vorbis/Opus comment - + Expand all - + Collapse all - + No write access; the file has been opened in read-only mode. - + The file is composed of multiple segments. Dealing with such files has not been tested yet and might be broken. - + The tags have been saved, but there is/are %1 warning(s) @@ -2907,7 +2919,7 @@ the file reverting all unsaved changings. - + and %1 error(s). @@ -2915,7 +2927,7 @@ the file reverting all unsaved changings. - + The tags have been saved, but there is/are %1 warning(s). @@ -2923,72 +2935,72 @@ the file reverting all unsaved changings. - + The tags have been saved. - + The tags couldn't be saved. See the info box for detail. - + The tags couldn't be saved because an IO error occured. - + Automatic tag management - + The container format of the selected file is not supported. The file can be treated as MP3 file (an ID3 tag according to the settings will be created). This might break the file. Do you want to continue? - + Treat file as MP3 file - + The currently opened file changed on the disk. - + A tag (with the selected target) already exists. - + The tag can not be created. - + Unable to remove the tag because the current process hasn't been finished yet. - + Unable to remove the tag because no file is opened. - + Unable to change the target because the current process hasn't been finished yet. - + Unable to change the target because no file is opened. - + Can not change the target of the selected tag because the tag does not support targets. @@ -3002,992 +3014,992 @@ the file reverting all unsaved changings. - - - - - - + + + + + + empty - + Country - + Folk - + Jazz - + Rock - + Reggae - + Blues - + A capella - + Abstract - + Acid - + Acid Jazz - + Acid Punk - + Acoustic - + Alternative - + Alternative Rock - + Ambient - + Anime - + Art Rock - + Audio Theatre - + Audiobook - + Avantgarde - + Ballad - + Baroque - + Bass - + Beat - + Bebop - + Bhangra - + Big Band - + Big Beat - + Black Metal - + Bluegrass - + Booty Bass - + Breakbeat - + BritPop - + Cabaret - + Celtic - + Chamber Music - + Chanson - + Chillout - + Chorus - + Christian Gangsta Rap - + Christian Rap - + Christian Rock - + Classic Rock - + Classical - + Club - + Club-House - + Comedy - + Contemporary Christian - + Crossover - + Cult - + Dance - + Dance Hall - + Darkwave - + Death Metal - + Disco - + Downtempo - + Dream - + Drum & Bass - + Drum Solo - + Dub - + Dubstep - + Duet - + Easy Listening - + EBM - + Eclectic - + Electro - + Electroclash - + Electronic - + Emo - + Ethnic - + Euro-House - + Euro-Techno - + Eurodance - + Experimental - + Fast Fusion - + Folk-Rock - + Folklore - + Freestyle - + Funk - + Fusion - + G-Funk - + Game - + Gangsta - + Garage - + Garage Rock - + Global - + Goa - + Gospel - + Gothic - + Gothic Rock - + Grunge - + Hard Rock - + Hardcore Techno - + Heavy Metal - + Hip-Hop - + House - + Humour - + IDM - + Illbient - + Indie - + Indie Rock - + Industrial - + Industro-Goth - + Instrumental - + Instrumental Pop - + Instrumental Rock - + Jam Band - + Jazz & Funk - + Jpop - + Jungle - + Krautrock - + Latin - + Leftfield - + Lo-Fi - + Lounge - + Math Rock - + Meditative - + Merengue - + Metal - + Musical - + National Folk - + Native US - + Negerpunk - + Neoclassical - + Neue Deutsche Welle - + New Age - + New Romantic - + New Wave - + Noise - + Nu-Breakz - + Oldies - + Opera - + Podcast - + Polka - + Polsk Punk - + Pop - + Pop-Folk - + Pop/Funk - + Porn Groove - + Post-Punk - + Post-Rock - + Power Ballad - + Pranks - + Primus - + Progressive Rock - + Psychedelic - + Psychedelic Rock - + Psytrance - + Punk - + Punk Rock - + Rap - + Rave - + Retro - + Revival - + Rhythmic Soul - + Rock & Roll - + Salsa - + Samba - + Satire - + Shoegaze - + Showtunes - + Ska - + Slow Jam - + Slow Rock - + Sonata - + Soul - + Sound Clip - + Soundtrack - + Southern Rock - + Space - + Space Rock - + Speech - + Swing - + Symphonic Rock - + Symphony - + Synthpop - + Tango - + Techno - + Techno-Industrial - + Terror - + Thrash Metal - + Top 40 - + Trailer - + Trance - + Tribal - + Trip-Hop - + Trop Rock - + Vocal - + World Music - + of - + Description - + editing widget for field type not supported - + The value of this field could not be read from the file because it couldn't be converted proberly. - + The field can not be applied when saving the file and will be lost. - + restore - + restore to value from %1 (%2) diff --git a/translations/tageditor_en_US.ts b/translations/tageditor_en_US.ts index 5a91a84..03d8674 100644 --- a/translations/tageditor_en_US.ts +++ b/translations/tageditor_en_US.ts @@ -852,65 +852,70 @@ Remarks QtGui::EditorGeneralOptionPage - + General - + Keep field values from previously shown file when the value of the opened file is empty - + No, disable this feature - + Yes, but only if both files are in the sa&me directory - + Yes, &regardless where the files are stored - + Handling of multiple tags - + Use one editor for ta&gs with the same target - + Use always se&parate editors - + Miscellaneous - + Save changings and open next file when pressing enter - + Ask before deleting all tags - + Hide tag selection combo box when not needed + + + Hide cover buttons + + QtGui::EditorTempOptionPage @@ -925,7 +930,7 @@ Remarks - + To avoid unnecessary copying this directory should be on the same partition as the files you want to edit. @@ -1522,12 +1527,12 @@ another position would prevent rewriting the entire file - + Minimum padding must be less or equal than maximum padding. - + These options might be ignored if not supported by either the format or the implementation. @@ -2020,199 +2025,201 @@ another position would prevent rewriting the entire file - - + + Add - + Remove - + Extract - + Display - + Restore - + Other - + 32x32 File icon - + Other file icon - + Cover (front) - + Cover (back) - + Leaflet page - + Media (e. g. label side of CD) - + Lead artist/performer/soloist - + Artist/performer - + Conductor - + Band/Orchestra - + Composer - + Lyricist/text writer - + Recording Location - + During recording - + During performance - + Movie/video screen capture - + A bright coloured fish - + Illustration - + Band/artist logotype - + Publisher/Studio logotype - + Select a picture to add as cover - + + Enter/confirm mime type - + + Confirm or enter the mime type of the selected file. - + The selected file is very large (for a cover). Do you want to continue? - + An IO error occured when parsing the specified cover file. - + Unable to parse specified cover file. - + There is no cover to remove. - + There is no image attached to be extracted. - + Where do you want to save the cover? - + The cover has extracted. - + Unable to write to output file. - + Unable to open output file. - + The attached image can't be found. @@ -2232,20 +2239,25 @@ another position would prevent rewriting the entire file - + No image (of the selected type) attached. - + Unable to display attached image. - + Change + + + Change MIME-type + + QtGui::QueryResultsModel @@ -2536,17 +2548,17 @@ Error in line %1: %3 - + Tag processing - + Editor - + File browser @@ -2573,203 +2585,203 @@ Error in line %1: %3 QtGui::TagEditorWidget - + Add tag - + Remove tag - + Change target - + Segment %1 - + Attachments - + Matroska tag - + MP4/iTunes tag - + Vorbis/Opus comment - + Tag - + ID3v1 tag - + ID3v2 tag - - + + Copy - + Expand all - + Collapse all - + The file is beeing parsed ... - + Unable to load the selected file "%1" because the current process hasn't finished yet. - + Currently is not file opened. - + Unable to reload the file because the current process hasn't finished yet. - + The file could not be opened because an IO error occurred. - + File could be parsed correctly. - + File couldn't be parsed correctly. - + There are critical parsing notifications. - + There are warnings. - + No write access; the file has been opened in read-only mode. - + File format is not supported (an ID3 tag can be added anyways). - + The file is composed of multiple segments. Dealing with such files has not been tested yet and might be broken. - + There is no (supported) tag assigned. - + The file %1 has been opened. - + Saving tags ... - + No file has been opened. - + Unable to apply the entered tags to the file because the current process hasn't finished yet. - + Do you really want to delete all tags from the file? - + don't show this message again - + Deleting all tags ... - + The selected file stores no tag (at least no supported), so there is nothing to delete. - + No file has been opened, so no tags can be deleted. - + Unable to delete all tags from the file because the current process hasn't been finished yet. - + Cancelling ... - + Unable to start saving process because there an other process hasn't finished yet. - + The tags have been saved, but there is/are %1 warning(s) The tags have been saved, but there is %1 warning @@ -2777,7 +2789,7 @@ Error in line %1: %3 - + and %1 error(s). @@ -2785,7 +2797,7 @@ Error in line %1: %3 - + The tags have been saved, but there is/are %1 warning(s). The tags have been saved, but there is %1 warning. @@ -2793,72 +2805,72 @@ Error in line %1: %3 - + The tags have been saved. - + The tags couldn't be saved. See the info box for detail. - + The tags couldn't be saved because an IO error occured. - + Automatic tag management - + The container format of the selected file is not supported. The file can be treated as MP3 file (an ID3 tag according to the settings will be created). This might break the file. Do you want to continue? - + Treat file as MP3 file - + The currently opened file changed on the disk. - + A tag (with the selected target) already exists. - + The tag can not be created. - + Unable to remove the tag because no file is opened. - + Unable to remove the tag because the current process hasn't been finished yet. - + Unable to change the target because no file is opened. - + Can not change the target of the selected tag because the tag does not support targets. - + Unable to change the target because the current process hasn't been finished yet. @@ -2928,7 +2940,7 @@ the file reverting all unsaved changings. - + Abort @@ -3002,992 +3014,992 @@ the file reverting all unsaved changings. - - - - - - + + + + + + empty - + Blues - + A capella - + Abstract - + Acid - + Acid Jazz - + Acid Punk - + Acoustic - + Alternative - + Alternative Rock - + Ambient - + Anime - + Art Rock - + Audio Theatre - + Audiobook - + Avantgarde - + Ballad - + Baroque - + Bass - + Beat - + Bebop - + Bhangra - + Big Band - + Big Beat - + Black Metal - + Bluegrass - + Booty Bass - + Breakbeat - + BritPop - + Cabaret - + Celtic - + Chamber Music - + Chanson - + Chillout - + Chorus - + Christian Gangsta Rap - + Christian Rap - + Christian Rock - + Classic Rock - + Classical - + Club - + Club-House - + Comedy - + Contemporary Christian - + Country - + Crossover - + Cult - + Dance - + Dance Hall - + Darkwave - + Death Metal - + Disco - + Downtempo - + Dream - + Drum & Bass - + Drum Solo - + Dub - + Dubstep - + Duet - + Easy Listening - + EBM - + Eclectic - + Electro - + Electroclash - + Electronic - + Emo - + Ethnic - + Euro-House - + Euro-Techno - + Eurodance - + Experimental - + Fast Fusion - + Folk - + Folk-Rock - + Folklore - + Freestyle - + Funk - + Fusion - + G-Funk - + Game - + Gangsta - + Garage - + Garage Rock - + Global - + Goa - + Gospel - + Gothic - + Gothic Rock - + Grunge - + Hard Rock - + Hardcore Techno - + Heavy Metal - + Hip-Hop - + House - + Humour - + IDM - + Illbient - + Indie - + Indie Rock - + Industrial - + Industro-Goth - + Instrumental - + Instrumental Pop - + Instrumental Rock - + Jam Band - + Jazz - + Jazz & Funk - + Jpop - + Jungle - + Krautrock - + Latin - + Leftfield - + Lo-Fi - + Lounge - + Math Rock - + Meditative - + Merengue - + Metal - + Musical - + National Folk - + Native US - + Negerpunk - + Neoclassical - + Neue Deutsche Welle - + New Age - + New Romantic - + New Wave - + Noise - + Nu-Breakz - + Oldies - + Opera - + Podcast - + Polka - + Polsk Punk - + Pop - + Pop-Folk - + Pop/Funk - + Porn Groove - + Post-Punk - + Post-Rock - + Power Ballad - + Pranks - + Primus - + Progressive Rock - + Psychedelic - + Psychedelic Rock - + Psytrance - + Punk - + Punk Rock - + Rap - + Rave - + Reggae - + Retro - + Revival - + Rhythmic Soul - + Rock - + Rock & Roll - + Salsa - + Samba - + Satire - + Shoegaze - + Showtunes - + Ska - + Slow Jam - + Slow Rock - + Sonata - + Soul - + Sound Clip - + Soundtrack - + Southern Rock - + Space - + Space Rock - + Speech - + Swing - + Symphonic Rock - + Symphony - + Synthpop - + Tango - + Techno - + Techno-Industrial - + Terror - + Thrash Metal - + Top 40 - + Trailer - + Trance - + Tribal - + Trip-Hop - + Trop Rock - + Vocal - + World Music - + of - + Description - + editing widget for field type not supported - + The value of this field could not be read from the file because it couldn't be converted proberly. - + The field can not be applied when saving the file and will be lost. - + restore - + restore to value from %1 (%2)