diff --git a/LameXP.vcproj b/LameXP.vcproj
index 329963f9..8a277bd2 100644
--- a/LameXP.vcproj
+++ b/LameXP.vcproj
@@ -1550,6 +1550,10 @@
RelativePath=".\tmp\RCC_Images.cpp"
>
+
+
@@ -1664,6 +1668,40 @@
RelativePath=".\LameXP.rc"
>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/etc/Translation/update.bat b/etc/Translation/update.bat
new file mode 100644
index 00000000..296d582f
--- /dev/null
+++ b/etc/Translation/update.bat
@@ -0,0 +1,25 @@
+@echo off
+REM ---------------------------
+set "QTVARS=E:\Qt\MSVC\4.7.1\bin\qtvars.bat"
+REM ---------------------------
+call "%QTVARS%"
+del update.lst > NUL
+REM ---------------------------
+if exist update.lst (
+ echo "Failed to delete old 'update.lst' file!"
+ pause
+ exit
+)
+REM ---------------------------
+for %%f in (..\..\gui\*.ui) do (
+ echo %%f >> update.lst
+)
+for %%f in (..\..\src\*.cpp) do (
+ echo %%f >> update.lst
+)
+REM ---------------------------
+for %%f in (*.ts) do (
+ lupdate.exe @update.lst -ts %%f
+)
+REM ---------------------------
+pause
diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui
index 89d8bc5d..9d00b934 100644
--- a/gui/MainWindow.ui
+++ b/gui/MainWindow.ui
@@ -239,6 +239,46 @@
-
+
+
+
+
+
+
+ 200
+ 0
+ 0
+
+
+
+
+
+
+
+
+ 200
+ 0
+ 0
+
+
+
+
+
+
+
+
+ 200
+ 0
+ 0
+
+
+
+
+
+
+
+ PointingHandCursor
+
QFrame::StyledPanel
@@ -1174,12 +1214,19 @@
+
+
@@ -1512,6 +1567,10 @@
+
+
+
+
diff --git a/res/Localization.qrc b/res/Localization.qrc
new file mode 100644
index 00000000..fc2fb2d6
--- /dev/null
+++ b/res/Localization.qrc
@@ -0,0 +1,11 @@
+
+
+
+ localization/LameXP_DE.qm
+ localization/LameXP_DE.qm.txt
+ localization/LameXP_FR.qm
+ localization/LameXP_FR.qm.txt
+ localization/LameXP_IT.qm
+ localization/LameXP_IT.qm.txt
+
+
diff --git a/res/localization/LameXP_DE.qm b/res/localization/LameXP_DE.qm
new file mode 100644
index 00000000..4afdc657
Binary files /dev/null and b/res/localization/LameXP_DE.qm differ
diff --git a/res/localization/LameXP_DE.qm.txt b/res/localization/LameXP_DE.qm.txt
new file mode 100644
index 00000000..176e5370
--- /dev/null
+++ b/res/localization/LameXP_DE.qm.txt
@@ -0,0 +1 @@
+Deutsch
\ No newline at end of file
diff --git a/res/localization/LameXP_FR.qm b/res/localization/LameXP_FR.qm
new file mode 100644
index 00000000..fc3990d7
Binary files /dev/null and b/res/localization/LameXP_FR.qm differ
diff --git a/res/localization/LameXP_FR.qm.txt b/res/localization/LameXP_FR.qm.txt
new file mode 100644
index 00000000..b6371257
--- /dev/null
+++ b/res/localization/LameXP_FR.qm.txt
@@ -0,0 +1 @@
+Française
\ No newline at end of file
diff --git a/res/localization/LameXP_IT.qm b/res/localization/LameXP_IT.qm
new file mode 100644
index 00000000..f7a36ac2
Binary files /dev/null and b/res/localization/LameXP_IT.qm differ
diff --git a/res/localization/LameXP_IT.qm.txt b/res/localization/LameXP_IT.qm.txt
new file mode 100644
index 00000000..c90c6734
--- /dev/null
+++ b/res/localization/LameXP_IT.qm.txt
@@ -0,0 +1 @@
+Italiano
\ No newline at end of file
diff --git a/src/Config.h b/src/Config.h
index 3e5bdb0f..f9d978ff 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -25,7 +25,7 @@
#define VER_LAMEXP_MAJOR 4
#define VER_LAMEXP_MINOR_HI 0
#define VER_LAMEXP_MINOR_LO 0
-#define VER_LAMEXP_BUILD 189
+#define VER_LAMEXP_BUILD 193
#define VER_LAMEXP_SUFFIX TechPreview
/*
diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp
index eef846e3..9edbd97e 100644
--- a/src/Dialog_MainWindow.cpp
+++ b/src/Dialog_MainWindow.cpp
@@ -59,6 +59,8 @@
#include
#include
#include
+#include
+#include
//Win32 includes
#include
@@ -80,6 +82,16 @@ private:
int m_index;
};
+//Helper class
+class Tag: public QObjectUserData
+{
+public:
+ Tag(const QString &text) : m_text(text) {}
+ QString text(void) { return m_text; }
+private:
+ const QString m_text;
+};
+
////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////
@@ -88,6 +100,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
:
QMainWindow(parent),
m_fileListModel(fileListModel),
+ m_currentTranslator(new QTranslator),
m_metaData(metaInfo),
m_settings(settingsModel),
m_accepted(false),
@@ -175,6 +188,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
QAction *showFolderContextAction = m_outputFolderContextMenu->addAction(QIcon(":/icons/zoom.png"), "Browse Selected Folder");
connect(outputFolderView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(outputFolderContextMenu(QPoint)));
connect(showFolderContextAction, SIGNAL(triggered(bool)), this, SLOT(showFolderContextActionTriggered()));
+ outputFolderLabel->installEventFilter(this);
//Setup "Meta Data" tab
m_metaInfoModel = new MetaInfoModel(m_metaData, 6);
@@ -251,6 +265,22 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
connect(m_styleActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(styleActionActivated(QAction*)));
styleActionActivated(NULL);
+ //Populate the language menu
+ m_languageActionGroup = new QActionGroup(this);
+ m_languageActionGroup->addAction(actionLanguageEnglish);
+ QStringList translations = QDir(":/localization").entryList(QStringList() << "*.qm", QDir::Files, QDir::Name);
+ for(int i = 0; i < translations.count(); i++)
+ {
+ QAction *currentLanguage = new QAction(this);
+ currentLanguage->setCheckable(true);
+ currentLanguage->setText(QString::fromUtf8(reinterpret_cast(QResource(QString(":/localization/%1.txt").arg(translations.at(i))).data())));
+ currentLanguage->setUserData(0, new Tag(translations.at(i)));
+ m_languageActionGroup->addAction(currentLanguage);
+ menuLanguage->addAction(currentLanguage);
+ }
+ connect(m_languageActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(languageActionActivated(QAction*)));
+ actionLanguageEnglish->setChecked(true);
+
//Activate tools menu actions
actionDisableUpdateReminder->setChecked(!m_settings->autoUpdateEnabled());
actionDisableSounds->setChecked(!m_settings->soundsEnabled());
@@ -317,9 +347,13 @@ MainWindow::~MainWindow(void)
sourceFileView->setModel(NULL);
metaDataView->setModel(NULL);
+ //Uninstall translator
+ QApplication::removeTranslator(m_currentTranslator);
+
//Free memory
LAMEXP_DELETE(m_tabActionGroup);
LAMEXP_DELETE(m_styleActionGroup);
+ LAMEXP_DELETE(m_languageActionGroup);
LAMEXP_DELETE(m_banner);
LAMEXP_DELETE(m_fileSystemModel);
LAMEXP_DELETE(m_messageHandler);
@@ -330,12 +364,16 @@ MainWindow::~MainWindow(void)
LAMEXP_DELETE(m_encoderButtonGroup);
LAMEXP_DELETE(m_sourceFilesContextMenu);
LAMEXP_DELETE(m_dropBox);
+ LAMEXP_DELETE(m_currentTranslator);
}
////////////////////////////////////////////////////////////
// PRIVATE FUNCTIONS
////////////////////////////////////////////////////////////
+/*
+ * Add file to source list
+ */
void MainWindow::addFiles(const QStringList &files)
{
if(files.isEmpty())
@@ -369,6 +407,9 @@ void MainWindow::addFiles(const QStringList &files)
// EVENTS
////////////////////////////////////////////////////////////
+/*
+ * Window is about to be shown
+ */
void MainWindow::showEvent(QShowEvent *event)
{
m_accepted = false;
@@ -390,6 +431,9 @@ void MainWindow::showEvent(QShowEvent *event)
}
}
+/*
+ * File dragged over window
+ */
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
QStringList formats = event->mimeData()->formats();
@@ -400,6 +444,9 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
}
}
+/*
+ * File dropped onto window
+ */
void MainWindow::dropEvent(QDropEvent *event)
{
ABORT_IF_BUSY;
@@ -432,6 +479,9 @@ void MainWindow::dropEvent(QDropEvent *event)
addFiles(droppedFiles);
}
+/*
+ * Window tries to close
+ */
void MainWindow::closeEvent(QCloseEvent *event)
{
if(m_banner->isVisible() || m_delayedFileTimer->isActive())
@@ -446,12 +496,18 @@ void MainWindow::closeEvent(QCloseEvent *event)
}
}
+/*
+ * Window was resized
+ */
void MainWindow::resizeEvent(QResizeEvent *event)
{
QMainWindow::resizeEvent(event);
m_dropNoteLabel->setGeometry(0, 0, sourceFileView->width(), sourceFileView->height());
}
+/*
+ * Event filter
+ */
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj == m_fileSystemModel && QApplication::overrideCursor() == NULL)
@@ -459,6 +515,26 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event)
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QTimer::singleShot(250, this, SLOT(restoreCursor()));
}
+ else if(obj == outputFolderLabel)
+ {
+ switch(event->type())
+ {
+ case QEvent::MouseButtonPress:
+ if(dynamic_cast(event)->button() == Qt::LeftButton)
+ {
+ QDesktopServices::openUrl(QString("file:///%1").arg(outputFolderLabel->text()));
+ }
+ break;
+ case QEvent::Enter:
+ qDebug("QEvent::HoverEnter");
+ outputFolderLabel->setForegroundRole(QPalette::Link);
+ break;
+ case QEvent::Leave:
+ qDebug("QEvent::HoverLeave");
+ outputFolderLabel->setForegroundRole(QPalette::WindowText);
+ break;
+ }
+ }
return false;
}
@@ -536,7 +612,7 @@ void MainWindow::windowShown(void)
QDate lastUpdateCheck = QDate::fromString(m_settings->autoUpdateLastCheck(), Qt::ISODate);
if(!lastUpdateCheck.isValid() || QDate::currentDate() >= lastUpdateCheck.addDays(14))
{
- if(QMessageBox::information(this, "Update Reminer", (lastUpdateCheck.isValid() ? "Your last update check was more than 14 days ago. Check for updates now?" : "Your did not check for LameXP updates yet. Check for updates now?"), "Check for Updates", "Defer") == 0)
+ if(QMessageBox::information(this, "Update Reminer", (lastUpdateCheck.isValid() ? "Your last update check was more than 14 days ago. Check for updates now?" : "Your did not check for LameXP updates yet. Check for updates now?"), "Check for Updates", "Postpone") == 0)
{
checkUpdatesActionActivated();
}
@@ -631,7 +707,7 @@ void MainWindow::encodeButtonClicked(void)
static const __int64 minimumFreeDiskspaceMultiplier = 2;
ABORT_IF_BUSY;
-
+
if(m_fileListModel->rowCount() < 1)
{
QMessageBox::warning(this, "LameXP", "You must add at least one file to the list before proceeding!");
@@ -878,6 +954,22 @@ void MainWindow::styleActionActivated(QAction *action)
}
}
+/*
+ * Language action triggered
+ */
+void MainWindow::languageActionActivated(QAction *action)
+{
+ QApplication::removeTranslator(m_currentTranslator);
+ if(action->userData(0))
+ {
+ if(m_currentTranslator->load(QString(":/localization/%1").arg(dynamic_cast(action->userData(0))->text())))
+ {
+ QApplication::installTranslator(m_currentTranslator);
+ }
+ }
+ retranslateUi(this);
+}
+
/*
* Output folder changed (mouse clicked)
*/
@@ -889,7 +981,7 @@ void MainWindow::outputFolderViewClicked(const QModelIndex &index)
}
QString selectedDir = m_fileSystemModel->filePath(index);
if(selectedDir.length() < 3) selectedDir.append(QDir::separator());
- outputFolderLabel->setText(selectedDir);
+ outputFolderLabel->setText(QDir::toNativeSeparators(selectedDir));
m_settings->outputDir(selectedDir);
}
@@ -909,9 +1001,18 @@ void MainWindow::outputFolderViewMoved(const QModelIndex &index)
*/
void MainWindow::gotoDesktopButtonClicked(void)
{
- outputFolderView->setCurrentIndex(m_fileSystemModel->index(QDesktopServices::storageLocation(QDesktopServices::DesktopLocation)));
- outputFolderViewClicked(outputFolderView->currentIndex());
- outputFolderView->setFocus();
+ QString desktopPath = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
+
+ if(!desktopPath.isEmpty() && QDir(desktopPath).exists())
+ {
+ outputFolderView->setCurrentIndex(m_fileSystemModel->index(desktopPath));
+ outputFolderViewClicked(outputFolderView->currentIndex());
+ outputFolderView->setFocus();
+ }
+ else
+ {
+ buttonGotoDesktop->setEnabled(false);
+ }
}
/*
@@ -919,9 +1020,18 @@ void MainWindow::gotoDesktopButtonClicked(void)
*/
void MainWindow::gotoHomeFolderButtonClicked(void)
{
- outputFolderView->setCurrentIndex(m_fileSystemModel->index(QDesktopServices::storageLocation(QDesktopServices::HomeLocation)));
- outputFolderViewClicked(outputFolderView->currentIndex());
- outputFolderView->setFocus();
+ QString homePath = QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
+
+ if(!homePath.isEmpty() && QDir(homePath).exists())
+ {
+ outputFolderView->setCurrentIndex(m_fileSystemModel->index(homePath));
+ outputFolderViewClicked(outputFolderView->currentIndex());
+ outputFolderView->setFocus();
+ }
+ else
+ {
+ buttonGotoHome->setEnabled(false);
+ }
}
/*
@@ -929,9 +1039,18 @@ void MainWindow::gotoHomeFolderButtonClicked(void)
*/
void MainWindow::gotoMusicFolderButtonClicked(void)
{
- outputFolderView->setCurrentIndex(m_fileSystemModel->index(QDesktopServices::storageLocation(QDesktopServices::MusicLocation)));
- outputFolderViewClicked(outputFolderView->currentIndex());
- outputFolderView->setFocus();
+ QString musicPath = QDesktopServices::storageLocation(QDesktopServices::MusicLocation);
+
+ if(!musicPath.isEmpty() && QDir(musicPath).exists())
+ {
+ outputFolderView->setCurrentIndex(m_fileSystemModel->index(musicPath));
+ outputFolderViewClicked(outputFolderView->currentIndex());
+ outputFolderView->setFocus();
+ }
+ else
+ {
+ buttonGotoMusic->setEnabled(false);
+ }
}
/*
@@ -1645,7 +1764,7 @@ void MainWindow::installWMADecoderActionTriggered(bool checked)
QFile::remove(setupFile);
QApplication::restoreOverrideCursor();
- if(QMessageBox::information(this, "WMA Decoder", "The WMA File Decoder has been installed. Please restart LameXP now!", "Quit LameXP", "Ignore") == 0)
+ if(QMessageBox::information(this, "WMA Decoder", "The WMA File Decoder has been installed. Please restart LameXP now!", "Quit LameXP", "Postpone") == 0)
{
QApplication::quit();
}
diff --git a/src/Dialog_MainWindow.h b/src/Dialog_MainWindow.h
index 2596263b..a6cdc6ec 100644
--- a/src/Dialog_MainWindow.h
+++ b/src/Dialog_MainWindow.h
@@ -35,6 +35,7 @@ class FileListModel;
class AbstractEncoder;
class QMenu;
class DropBox;
+class QTranslator;
class MainWindow: public QMainWindow, private Ui::MainWindow
{
@@ -60,6 +61,7 @@ private slots:
void tabPageChanged(int idx);
void tabActionActivated(QAction *action);
void styleActionActivated(QAction *action);
+ void languageActionActivated(QAction *action);
void outputFolderViewClicked(const QModelIndex &index);
void outputFolderViewMoved(const QModelIndex &index);
void makeFolderButtonClicked(void);
@@ -112,6 +114,7 @@ private:
QFileSystemModelEx *m_fileSystemModel;
QActionGroup *m_tabActionGroup;
QActionGroup *m_styleActionGroup;
+ QActionGroup *m_languageActionGroup;
QButtonGroup *m_encoderButtonGroup;
QButtonGroup *m_modeButtonGroup;
WorkingBanner *m_banner;
@@ -125,4 +128,5 @@ private:
QMenu *m_sourceFilesContextMenu;
QMenu *m_outputFolderContextMenu;
DropBox *m_dropBox;
+ QTranslator *m_currentTranslator;
};
diff --git a/src/Global.cpp b/src/Global.cpp
index 0308bd21..2c6bf5b5 100644
--- a/src/Global.cpp
+++ b/src/Global.cpp
@@ -523,6 +523,11 @@ bool lamexp_init_qt(int argc, char* argv[])
}
}
+ //Load translation
+ //QTranslator *translator = new QTranslator();
+ //translator->load(":/localization/LameXP_DE.qm");
+ //application->installTranslator(translator);
+
//Done
qt_initialized = true;
return true;