diff --git a/win-linux/defaults.pri b/win-linux/defaults.pri index 60f5181fb..f417a0840 100644 --- a/win-linux/defaults.pri +++ b/win-linux/defaults.pri @@ -38,7 +38,8 @@ HEADERS += \ $$PWD/src/cmainpanel.h \ $$PWD/src/csplash.h \ $$PWD/src/cmessage.h \ - $$PWD/src/cfilechecker.h + $$PWD/src/cfilechecker.h \ + $$PWD/src/clangater.h # src/ctabbar_p.h \ # src/ctabstyle.h \ # src/ctabstyle_p.h @@ -59,7 +60,8 @@ SOURCES += \ $$PWD/src/chelp.cpp \ $$PWD/src/cmainpanel.cpp \ $$PWD/src/cmessage.cpp \ - $$PWD/src/cfilechecker.cpp + $$PWD/src/cfilechecker.cpp \ + $$PWD/src/clangater.cpp # src/ctabstyle.cpp # src/casclabel.cpp diff --git a/win-linux/src/clangater.cpp b/win-linux/src/clangater.cpp new file mode 100644 index 000000000..a7bf6dd07 --- /dev/null +++ b/win-linux/src/clangater.cpp @@ -0,0 +1,120 @@ +#include "clangater.h" +#include "defines.h" + +#include +#include +#include +#include +#include + +#include + +#include + +class CLangater::CLangaterIntf +{ +public: + QTranslator * createTranslator() + { + m_list.push_back(new QTranslator); + return m_list.back(); + } + + ~CLangaterIntf() + { + if ( !m_list.empty() ) { + for (auto p: m_list) { + QTranslator * t = p; + if ( !t->parent() ) + delete t; + } + } + } + +private: + std::list m_list; +}; + +CLangater::CLangater() + : m_intf(new CLangater::CLangaterIntf) +{ +} + +CLangater::~CLangater() +{ + delete m_intf, m_intf = nullptr; +} + +CLangater * CLangater::getInstance() +{ + static CLangater _instance; + return &_instance; +} + +void CLangater::init() +{ + GET_REGISTRY_USER(reg_user) + + QString _lang, + _lang_path = ":/i18n/langs/", + _cmd_args = QCoreApplication::arguments().join(','); + + QRegularExpression _re(reCmdLang); + QRegularExpressionMatch _re_match = _re.match(_cmd_args); + if ( _re_match.hasMatch() ) { + _lang = _re_match.captured(2); + + if ( !_re_match.captured(1).isEmpty() && !_lang.isEmpty() ) { + reg_user.setValue("locale", _lang); + } + } + + if ( _lang.isEmpty() ) + _lang = reg_user.value("locale").value(); + +#ifdef __linux +// if ( _lang.isEmpty() ) { +// _lang = QLocale::system().name(); +// } + + if ( _lang.isEmpty() ) { + QString _env_name = qgetenv("LANG"); + _re.setPattern("^(\\w{2,5})\\.?"); + _re_match = _re.match(_env_name); + + if ( _re_match.hasMatch() ) { + _lang = _re_match.captured(1); + } + } +#else + // read setup language and set application locale + !g_lang.size() && + !((g_lang = reg_system.value("locale").value()).size()) && (g_lang = "en").size(); +#endif + + if ( !QFile(_lang_path + _lang + ".qm").exists() ) { + if ( QFile("./langs/" + _lang + ".qm").exists() ) { + _lang_path = "./langs"; + } else + if ( QFile(_lang_path + _lang.left(2) + ".qm").exists() ) { + _lang = _lang.left(2); + } else + if ( QFile("./langs/" + _lang.left(2) + ".qm").exists() ) { + _lang = _lang.left(2); + _lang_path = "./langs"; + } else + _lang = "en"; + } + + QTranslator * tr = getInstance()->m_intf->createTranslator(); + if ( tr->load(_lang, _lang_path) ) { + getInstance()->m_lang = _lang; + } + + QCoreApplication::installTranslator(tr); +} + +QString CLangater::getLanguageName() +{ + return getInstance()->m_lang; +} diff --git a/win-linux/src/clangater.h b/win-linux/src/clangater.h new file mode 100644 index 000000000..fdcffd77a --- /dev/null +++ b/win-linux/src/clangater.h @@ -0,0 +1,23 @@ +#ifndef CLANGATER_H +#define CLANGATER_H + +#include + +class CLangater +{ +public: + ~CLangater(); + + static CLangater * getInstance(); + static void init(); + static QString getLanguageName(); + +private: + CLangater(); + QString m_lang; + + class CLangaterIntf; + CLangaterIntf * m_intf; +}; + +#endif // CLANGATER_H diff --git a/win-linux/src/cmainpanel.cpp b/win-linux/src/cmainpanel.cpp index d135c85cc..cfaf9d0d4 100644 --- a/win-linux/src/cmainpanel.cpp +++ b/win-linux/src/cmainpanel.cpp @@ -56,6 +56,7 @@ #include "version.h" #include "cmessage.h" #include "cfilechecker.h" +#include "clangater.h" #ifdef _WIN32 #include "win/cprintdialog.h" @@ -262,7 +263,7 @@ CMainPanel::CMainPanel(QWidget *parent, CAscApplicationManager *manager, bool is m_pButtonDownload->setVisible(false, false); QString params = QString("lang=%1&username=%3&location=%2") - .arg(g_lang, Utils::systemLocationCode()); + .arg(CLangater::getLanguageName(), Utils::systemLocationCode()); wstring wparams = params.toStdWString(); wstring user_name = readSystemUserName(); @@ -900,9 +901,7 @@ void CMainPanel::loadStartPage() # endif #endif - QString additional = "?waitingloader=yes"; - if (!g_lang.isEmpty()) - additional.append("&lang=" + g_lang); + QString additional = "?waitingloader=yes&lang=" + CLangater::getLanguageName(); QString _portal = _reg_user.value("portal").value(); if (!_portal.isEmpty()) { diff --git a/win-linux/src/defines.h b/win-linux/src/defines.h index fffa584a2..41dc4d5ba 100644 --- a/win-linux/src/defines.h +++ b/win-linux/src/defines.h @@ -36,8 +36,7 @@ #define rePortalName "^https?:\\/\\/(.+)" #define reFileExtension "\\.(\\w{1,10})$" #define reUserName "([^\\.]+)\\.?([^\\.]+)?" -#define reCmdLang "^--(?:keep)?lang:\\w{2}" -#define reCmdKeepLang "^--keeplang:\\w{2}" +#define reCmdLang "--(keep)?lang:(\\w{2,5})" #define FILE_DOWNLOAD_START 3 diff --git a/win-linux/src/linux/cmainwindow.cpp b/win-linux/src/linux/cmainwindow.cpp index e281808e1..2739eff0f 100644 --- a/win-linux/src/linux/cmainwindow.cpp +++ b/win-linux/src/linux/cmainwindow.cpp @@ -111,9 +111,6 @@ void CMainWindow::parseInputArgs(const QStringList& inlist) while (i.hasNext()) { _arg = i.next(); - if (_arg.contains(QRegExp(reCmdKeepLang))) { - reg_user.setValue("locale", _arg.right(2)); - } else if (_arg.contains("--system-title-bar")) { reg_user.setValue("titlebar", "system"); } else diff --git a/win-linux/src/main.cpp b/win-linux/src/main.cpp index 40f68e213..bfec3b8e2 100644 --- a/win-linux/src/main.cpp +++ b/win-linux/src/main.cpp @@ -59,8 +59,9 @@ #include "chelp.h" #include "common/File.h" +#include + BYTE g_dpi_ratio = 1; -QString g_lang; int main( int argc, char *argv[] ) { @@ -174,30 +175,10 @@ int main( int argc, char *argv[] ) delete application_cef; delete pApplicationManager; return 0; - } else - if (!((_arg_i = app.arguments().indexOf(QRegularExpression(reCmdLang), 1)) < 0)) { - g_lang = app.arguments().at(_arg_i).right(2); } - if (!g_lang.size()) - g_lang = reg_user.value("locale").value(); + CLangater::init(); -#ifdef __linux - if (!g_lang.size()) { - g_lang = QLocale::system().name().left(2); - if (!QFile(":/i18n/langs/" + g_lang + ".qm").exists()) g_lang = "en"; - } -#else - // read setup language and set application locale - !g_lang.size() && - !((g_lang = reg_system.value("locale").value()).size()) && (g_lang = "en").size(); -#endif - - QTranslator tr; - if (g_lang.length()) { - tr.load(g_lang, ":/i18n/langs"); - app.installTranslator(&tr); - } /* applying languages finished */ #ifdef _WIN32 diff --git a/win-linux/src/win/cwinpanel.cpp b/win-linux/src/win/cwinpanel.cpp index a0ab1ad28..af223890d 100644 --- a/win-linux/src/win/cwinpanel.cpp +++ b/win-linux/src/win/cwinpanel.cpp @@ -101,16 +101,11 @@ CWinPanel::CWinPanel( HWND hWnd, CAscApplicationManager* pManager ) // m_pManager->SetEventListener(this); panel->setInputFiles(Utils::getInputFiles(qApp->arguments())); - parseInputArgs(qApp->arguments()); +// parseInputArgs(qApp->arguments()); } void CWinPanel::parseInputArgs(const QStringList& args) { - int _arg_i; - if (!(_arg_i = args.indexOf(QRegExp(reCmdKeepLang)) < 0)) { - GET_REGISTRY_USER(_reg_user); - _reg_user.setValue("locale", args.at(_arg_i).right(2)); - } } bool CWinPanel::nativeEvent( const QByteArray &, void * msg, long * result)