Localization v1.5.0
Localization subsystem
Loading...
Searching...
No Matches
MultiLocalizationManager.cpp
1#include "MultiLocalizationManager.h"
2
3#include <fstream>
4#include <mutex>
5
6#include <JsonArrayWrapper.h>
7
8#include "LocalizationConstants.h"
9
10namespace localization
11{
12#ifdef __LINUX__
13 MultiLocalizationManager::LocalizationHolder::LocalizationHolder(TextLocalization&& localization) noexcept :
14 localization(std::move(localization))
15 {
16
17 }
18#else
19 MultiLocalizationManager::LocalizationHolder::LocalizationHolder(TextLocalization&& localization, WTextLocalization&& wlocalization) noexcept :
20 localization(std::move(localization)),
21 wlocalization(std::move(wlocalization))
22 {
23
24 }
25#endif
26
27 MultiLocalizationManager::MultiLocalizationManager()
28 {
29 if (!std::filesystem::exists(localizationModulesFile))
30 {
31 throw std::runtime_error(std::format("Can't find {}", localizationModulesFile));
32 }
33
34 TextLocalization::get();
35
36#ifndef __LINUX__
37 WTextLocalization::get();
38#endif
39
40 settings.setJSONData(std::ifstream(localizationModulesFile.data()));
41
42 defaultModuleName = settings.get<std::string>(settings::defaultModuleSetting);
43
44 if (settings.begin() != settings.end())
45 {
46 std::vector<std::string> modules = json::utility::JsonArrayWrapper(settings.get<std::vector<json::JsonObject>>(settings::modulesSetting)).as<std::string>();
47
48 for (const std::string& module : modules)
49 {
50 this->addModule(module);
51 }
52 }
53 }
54
55 MultiLocalizationManager::~MultiLocalizationManager()
56 {
57 for (const auto& [_, localization] : localizations)
58 {
59 delete localization;
60 }
61
62 localizations.clear();
63 }
64
65 std::string MultiLocalizationManager::getVersion()
66 {
67 std::string version = "1.5.0";
68
69 return version;
70 }
71
72 MultiLocalizationManager& MultiLocalizationManager::getManager()
73 {
74 static MultiLocalizationManager instance;
75
76 return instance;
77 }
78
79 MultiLocalizationManager::LocalizationHolder* MultiLocalizationManager::addModule(const std::string& localizationModuleName, const std::filesystem::path& pathToLocalizationModule)
80 {
81 if (pathToLocalizationModule == defaultModuleName)
82 {
83 throw std::runtime_error(format("pathToLocalizationModule can't be {}", defaultModuleName));
84 }
85
86 std::lock_guard<std::shared_mutex> lock(mapMutex);
87
88 TextLocalization textLocalizationModule(pathToLocalizationModule.string());
89
90#ifndef __LINUX__
91 WTextLocalization wtextLocalizationModule(textLocalizationModule);
92#endif
93
94 return localizations.try_emplace
95 (
96 localizationModuleName,
97 new LocalizationHolder
98 (
99 std::move(textLocalizationModule)
100#ifndef __LINUX__
101 , std::move(wtextLocalizationModule)
102#endif
103 )
104 ).first->second;
105 }
106
107 bool MultiLocalizationManager::removeModule(std::string_view localizationModuleName)
108 {
109 std::lock_guard<std::shared_mutex> lock(mapMutex);
110
111 auto it = localizations.find(localizationModuleName);
112
113 if (it == localizations.end())
114 {
115 return false;
116 }
117
118 localizations.erase(it);
119
120 delete it->second;
121
122 return true;
123 }
124
125 MultiLocalizationManager::LocalizationHolder* MultiLocalizationManager::getModule(std::string_view localizationModuleName) const
126 {
127 if (localizationModuleName == defaultModuleName)
128 {
129 throw std::runtime_error(std::format("pathToLocalizationModule can't be {}", defaultModuleName));
130 }
131
132 std::shared_lock<std::shared_mutex> lock(mapMutex);
133
134 if (auto it = localizations.find(localizationModuleName); it != localizations.end())
135 {
136 return it->second;
137 }
138
139 throw std::runtime_error(format("Can't find Localization holder with module name: {}", localizationModuleName));
140
141 return nullptr;
142 }
143
144 std::string_view MultiLocalizationManager::getLocalizedString(std::string_view localizationModuleName, std::string_view key, std::string_view language) const
145 {
146 if (localizationModuleName == defaultModuleName)
147 {
148 return TextLocalization::get().getString(key, language);
149 }
150
151 std::shared_lock<std::shared_mutex> lock(mapMutex);
152 auto it = localizations.find(localizationModuleName);
153
154 if (it == localizations.end())
155 {
156 throw std::runtime_error(std::format("Can't find Localization holder with module name: {}", localizationModuleName));
157 }
158
159 TextLocalization& text = it->second->localization;
160
161 return language.empty() ? text[key] : text.getString(key, language);
162 }
163
164#ifndef __LINUX__
165 std::wstring_view MultiLocalizationManager::getLocalizedWideString(std::string_view localizationModuleName, std::string_view key, std::string_view language) const
166 {
167 if (localizationModuleName == defaultModuleName)
168 {
169 return WTextLocalization::get().getString(key, language);
170 }
171
172 std::shared_lock<std::shared_mutex> lock(mapMutex);
173 auto it = localizations.find(localizationModuleName);
174
175 if (it == localizations.end())
176 {
177 throw std::runtime_error(std::format("Can't find Localization holder with module name: {}", localizationModuleName));
178 }
179
180 WTextLocalization& text = it->second->wlocalization;
181
182 return language.empty() ? text[key] : text.getString(key, language);
183 }
184#endif
185}