1#include "MultiLocalizationManager.h"
6#include <JsonArrayWrapper.h>
8#include "LocalizationConstants.h"
13 MultiLocalizationManager::LocalizationHolder::LocalizationHolder(TextLocalization&& localization) noexcept :
14 localization(std::move(localization))
19 MultiLocalizationManager::LocalizationHolder::LocalizationHolder(TextLocalization&& localization, WTextLocalization&& wlocalization) noexcept :
20 localization(std::move(localization)),
21 wlocalization(std::move(wlocalization))
27 MultiLocalizationManager::MultiLocalizationManager()
29 if (!std::filesystem::exists(localizationModulesFile))
31 throw std::runtime_error(std::format(
"Can't find {}", localizationModulesFile));
34 TextLocalization::get();
37 WTextLocalization::get();
40 settings.setJSONData(std::ifstream(localizationModulesFile.data()));
42 defaultModuleName = settings.get<std::string>(settings::defaultModuleSetting);
44 if (settings.begin() != settings.end())
46 std::vector<std::string> modules = json::utility::JsonArrayWrapper(settings.get<std::vector<json::JsonObject>>(settings::modulesSetting)).as<std::string>();
48 for (
const std::string& module : modules)
50 this->addModule(module);
55 MultiLocalizationManager::~MultiLocalizationManager()
57 for (
const auto& [_, localization] : localizations)
62 localizations.clear();
65 std::string MultiLocalizationManager::getVersion()
67 std::string version =
"1.5.0";
72 MultiLocalizationManager& MultiLocalizationManager::getManager()
74 static MultiLocalizationManager instance;
79 MultiLocalizationManager::LocalizationHolder* MultiLocalizationManager::addModule(
const std::string& localizationModuleName,
const std::filesystem::path& pathToLocalizationModule)
81 if (pathToLocalizationModule == defaultModuleName)
83 throw std::runtime_error(format(
"pathToLocalizationModule can't be {}", defaultModuleName));
86 std::lock_guard<std::shared_mutex> lock(mapMutex);
88 TextLocalization textLocalizationModule(pathToLocalizationModule.string());
91 WTextLocalization wtextLocalizationModule(textLocalizationModule);
94 return localizations.try_emplace
96 localizationModuleName,
97 new LocalizationHolder
99 std::move(textLocalizationModule)
101 , std::move(wtextLocalizationModule)
107 bool MultiLocalizationManager::removeModule(std::string_view localizationModuleName)
109 std::lock_guard<std::shared_mutex> lock(mapMutex);
111 auto it = localizations.find(localizationModuleName);
113 if (it == localizations.end())
118 localizations.erase(it);
125 MultiLocalizationManager::LocalizationHolder* MultiLocalizationManager::getModule(std::string_view localizationModuleName)
const
127 if (localizationModuleName == defaultModuleName)
129 throw std::runtime_error(std::format(
"pathToLocalizationModule can't be {}", defaultModuleName));
132 std::shared_lock<std::shared_mutex> lock(mapMutex);
134 if (
auto it = localizations.find(localizationModuleName); it != localizations.end())
139 throw std::runtime_error(format(
"Can't find Localization holder with module name: {}", localizationModuleName));
144 std::string_view MultiLocalizationManager::getLocalizedString(std::string_view localizationModuleName, std::string_view key, std::string_view language)
const
146 if (localizationModuleName == defaultModuleName)
148 return TextLocalization::get().getString(key, language);
151 std::shared_lock<std::shared_mutex> lock(mapMutex);
152 auto it = localizations.find(localizationModuleName);
154 if (it == localizations.end())
156 throw std::runtime_error(std::format(
"Can't find Localization holder with module name: {}", localizationModuleName));
159 TextLocalization& text = it->second->localization;
161 return language.empty() ? text[key] : text.getString(key, language);
165 std::wstring_view MultiLocalizationManager::getLocalizedWideString(std::string_view localizationModuleName, std::string_view key, std::string_view language)
const
167 if (localizationModuleName == defaultModuleName)
169 return WTextLocalization::get().getString(key, language);
172 std::shared_lock<std::shared_mutex> lock(mapMutex);
173 auto it = localizations.find(localizationModuleName);
175 if (it == localizations.end())
177 throw std::runtime_error(std::format(
"Can't find Localization holder with module name: {}", localizationModuleName));
180 WTextLocalization& text = it->second->wlocalization;
182 return language.empty() ? text[key] : text.getString(key, language);