diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index 886f7bfd3..7cc79d19a 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -19,7 +19,6 @@ #include "multilangmgr.h" #include -#include #ifdef WIN32 #include @@ -107,59 +106,52 @@ MultiLangMgr::MultiLangMgr () { } -MultiLangMgr::MultiLangMgr (const Glib::ustring& fname, MultiLangMgr* fallbackMgr) +void MultiLangMgr::load (const std::vector &fnames) { - load (fname, fallbackMgr); -} + translations.clear(); -bool MultiLangMgr::load (const Glib::ustring& fname, MultiLangMgr* fallbackMgr) -{ - this->fallbackMgr.reset(fallbackMgr); - - std::ifstream file(fname.c_str()); - if (!file.is_open()) { - return false; - } - - std::map translations; - std::string entry; - - while (std::getline(file, entry)) { - - if (entry.empty() || entry.front() == '#' || entry.front() == '!') { + for (const auto& fname : fnames) { + if(fname.empty()) { continue; } - std::string key, value; - - std::istringstream line(entry); - - if (!std::getline(line, key, ';') || !std::getline(line, value)) { + std::ifstream file(fname.c_str()); + if (!file.is_open()) { continue; } - static const std::regex newline("\\\\n"); - value = std::regex_replace(value, newline, "\n"); + std::string entry; + auto hint = translations.begin(); + while (std::getline(file, entry)) { - translations.emplace(key, value); + if (entry.empty() || entry.front() == '#' || entry.front() == '!') { + continue; + } + + std::string key, value; + + std::istringstream line(entry); + + if(std::getline(line, key, ';') && translations.find(key) == translations.end() && std::getline(line, value)) { + size_t pos = 0; + while((pos = value.find("\\n", pos)) != std::string::npos) { + value.replace(pos, 2, "\n"); + pos++; + } + hint = translations.emplace_hint(hint, key, value); + } + } } - - this->translations.swap(translations); - return true; } Glib::ustring MultiLangMgr::getStr (const std::string& key) const { - const auto iterator = translations.find (key); + const auto iterator = translations.find(key); - if (iterator != translations.end ()) { + if (iterator != translations.end()) { return iterator->second; } - if (fallbackMgr) { - return fallbackMgr->getStr (key); - } - return key; } diff --git a/rtgui/multilangmgr.h b/rtgui/multilangmgr.h index be46b1197..d439307e3 100644 --- a/rtgui/multilangmgr.h +++ b/rtgui/multilangmgr.h @@ -20,8 +20,8 @@ #define _MULTILANGMGR_ #include -#include #include +#include #include @@ -29,22 +29,14 @@ class MultiLangMgr { public: MultiLangMgr (); - MultiLangMgr (const Glib::ustring& fname, MultiLangMgr* fallbackMgr = nullptr); -public: - bool load (const Glib::ustring& fname, MultiLangMgr* fallbackMgr = nullptr); - -public: - Glib::ustring getStr (const std::string& key) const; - -public: - static bool isOSLanguageDetectSupported (); - static Glib::ustring getOSUserLanguage (); + void load(const std::vector &fnames); + Glib::ustring getStr(const std::string& key) const; + static bool isOSLanguageDetectSupported(); + static Glib::ustring getOSUserLanguage(); private: std::map translations; - std::unique_ptr fallbackMgr; - }; extern MultiLangMgr langMgr; diff --git a/rtgui/options.cc b/rtgui/options.cc index 98db977fc..3906a293d 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -2327,7 +2327,7 @@ void Options::load (bool lightweight) } } - langMgr.load (localeTranslation, new MultiLangMgr (languageTranslation, new MultiLangMgr (defaultTranslation))); + langMgr.load ({localeTranslation, languageTranslation, defaultTranslation}); rtengine::init (&options.rtSettings, argv0, rtdir, !lightweight); }