3434#include < QtCore/QDir>
3535
3636Application::Application (int & argc, char ** argv)
37- : QApplication(argc, argv) {
37+ : QApplication(argc, argv),
38+ m_currentLocale(" en" ) {
39+ initTranslations ();
3840}
3941
4042bool Application::notify (QObject* receiver, QEvent* e) {
4143 try {
4244 return QApplication::notify (receiver, e);
43- } catch (std::bad_alloc const &) {
45+ } catch (const std::bad_alloc&) {
4446 OutOfMemoryHandler::instance ().handleOutOfMemorySituation ();
4547
4648 return false ;
@@ -52,35 +54,52 @@ void Application::installLanguage(const QString& locale) {
5254 return ;
5355 }
5456
55- QString const translation (" scantailor_" + locale);
56- QStringList const translation_dirs (
57- QString::fromUtf8 (TRANSLATION_DIRS).split (QChar (' :' ), QString::SkipEmptyParts)
58- );
59- bool loaded = false ;
60- for (QString const & path : translation_dirs) {
61- QString absolute_path;
62- if (QDir::isAbsolutePath (path)) {
63- absolute_path = path;
64- } else {
65- absolute_path = this ->applicationDirPath ();
66- absolute_path += QChar (' /' );
67- absolute_path += path;
68- }
69- absolute_path += QChar (' /' );
70- absolute_path += translation;
57+ if (m_translationsMap.find (locale) != m_translationsMap.end ()) {
58+ bool loaded = m_translator.load (m_translationsMap[locale]);
7159
72- loaded = m_translator.load (absolute_path);
73- if (loaded) {
74- break ;
75- }
76- }
77-
78- this ->removeTranslator (&m_translator);
79- this ->installTranslator (&m_translator);
60+ this ->removeTranslator (&m_translator);
61+ this ->installTranslator (&m_translator);
8062
81- m_currentLocale = (loaded) ? locale : " en" ;
63+ m_currentLocale = (loaded) ? locale : " en" ;
64+ } else {
65+ this ->removeTranslator (&m_translator);
66+
67+ m_currentLocale = " en" ;
68+ }
8269}
8370
8471const QString& Application::getCurrentLocale () const {
8572 return m_currentLocale;
86- }
73+ }
74+
75+ std::list<QString> Application::getLanguagesList () const {
76+ std::list<QString> list{ " en" };
77+ std::transform (m_translationsMap.begin (), m_translationsMap.end (),
78+ std::back_inserter (list),
79+ [](const std::pair<QString, QString>& val) {
80+ return val.first ;
81+ });
82+
83+ return list;
84+ }
85+
86+ void Application::initTranslations () {
87+ const QStringList translation_dirs (
88+ QString::fromUtf8 (TRANSLATION_DIRS).split (QChar (' :' ), QString::SkipEmptyParts)
89+ );
90+
91+ const QStringList language_file_filter (" scantailor_*.qm" );
92+ for (const QString& path : translation_dirs) {
93+ QDir dir (path);
94+ if (dir.exists ()) {
95+ QStringList translationFileNames = QDir (path).entryList (language_file_filter);
96+ for (const QString& fileName : translationFileNames) {
97+ QString locale (fileName);
98+ locale.truncate (locale.lastIndexOf (' .' ));
99+ locale.remove (0 , locale.indexOf (' _' ) + 1 );
100+
101+ m_translationsMap[locale] = dir.absoluteFilePath (fileName);
102+ }
103+ }
104+ }
105+ }
0 commit comments