3#include "WTextLocalization.h"
5static std::wstring to_wstring(std::string_view source);
9 void BaseTextLocalization<wchar_t>::convertLocalization(
const TextLocalization& localizationModule)
11 using getDictionariesLanguages =
const char** (*)(uint64_t* size);
12 using getDictionary =
const char* (*)(
const char* language, uint64_t* size,
const char*** key,
const char*** values);
13 using freeDictionary = void(*)(
const char** keys,
const char** values);
15 auto load = [
this](HMODULE handle,
const char* name)
18 return dlsym(handle, name);
20 return GetProcAddress(handle, name);
24 originalLanguage = localizationModule.getOriginalLanguage();
25 language = localizationModule.language;
26 pathToModule = localizationModule.getPathToModule();
28 getDictionariesLanguages dictionariesLanguagesFunction =
reinterpret_cast<getDictionariesLanguages
>(load(localizationModule.handle,
"getDictionariesLanguages"));
29 getDictionary dictionaryFunction =
reinterpret_cast<getDictionary
>(load(localizationModule.handle,
"getDictionary"));
30 freeDictionary freeDictionaryFunction =
reinterpret_cast<freeDictionary
>(load(localizationModule.handle,
"freeDictionary"));
32 uint64_t languagesSize = 0;
33 const char** languages = dictionariesLanguagesFunction(&languagesSize);
35 for (uint64_t i = 0; i < languagesSize; i++)
37 const char* language = languages[i];
38 std::unordered_map<std::string, std::wstring, utility::StringViewHash, utility::StringViewEqual> convertedDictionary;
39 uint64_t dictionarySize = 0;
43 dictionaryFunction(language, &dictionarySize, &keys, &values);
45 convertedDictionary.reserve(dictionarySize);
47 for (uint64_t j = 0; j < dictionarySize; j++)
49 convertedDictionary[keys[j]] = to_wstring(values[j]);
52 dictionaries[language] = move(convertedDictionary);
54 freeDictionaryFunction(keys, values);
57 reinterpret_cast<void(*)(
const char**)
>(load(localizationModule.handle,
"freeDictionariesLanguages"))(languages);
60 BaseTextLocalization<wchar_t>::BaseTextLocalization(std::string_view localizationModule) :
63 if (localizationModule == TextLocalization::get().getPathToModule())
65 this->convertLocalization(TextLocalization::get());
69 this->convertLocalization(TextLocalization(localizationModule));
73 BaseTextLocalization<wchar_t>::BaseTextLocalization(
const TextLocalization& localizationModule) :
76 this->convertLocalization(localizationModule);
79 BaseTextLocalization<wchar_t>::BaseTextLocalization(WTextLocalization&& other)
noexcept
81 (*this) = std::move(other);
84 WTextLocalization& BaseTextLocalization<wchar_t>::operator = (WTextLocalization&& other)
noexcept
86 dictionaries = std::move(other.dictionaries);
87 originalLanguage = std::move(other.originalLanguage);
88 language = std::move(other.language);
89 pathToModule = std::move(other.pathToModule);
94 BaseTextLocalization<wchar_t>& BaseTextLocalization<wchar_t>::get()
96 static std::unique_ptr<BaseTextLocalization<wchar_t>> instance;
100 json::JsonParser settings(std::ifstream(localizationModulesFile.data()));
102 instance = std::unique_ptr<WTextLocalization>(
new WTextLocalization(settings.get<std::string>(settings::defaultModuleSetting)));
108 void BaseTextLocalization<wchar_t>::changeLanguage(std::string_view language)
110 if (dictionaries.find(language) == dictionaries.end())
112 throw std::runtime_error(format(R
"(Wrong language value "{}")", language));
115 this->language = language;
118 std::string_view BaseTextLocalization<wchar_t>::getOriginalLanguage() const
120 return originalLanguage;
123 std::string_view BaseTextLocalization<wchar_t>::getCurrentLanguage()
const
128 const std::filesystem::path& BaseTextLocalization<wchar_t>::getPathToModule()
const
133 std::wstring_view BaseTextLocalization<wchar_t>::getString(std::string_view key, std::string_view language,
bool allowOriginal)
const
135 if (
auto languageIterator = dictionaries.find(language); languageIterator != dictionaries.end())
137 if (
auto keyIterator = languageIterator->second.find(key); keyIterator != languageIterator->second.end())
139 if (keyIterator->second.size())
141 return keyIterator->second;
146 return this->getString(key, originalLanguage,
false);
149 throw std::runtime_error(std::format(
"Can't find localized string with key: {}", key));
151 else if (allowOriginal)
153 return this->getString(key, originalLanguage,
false);
157 throw std::runtime_error(std::format(
"Can't find localized string with key: {}", key));
162 throw std::runtime_error(std::format(
"Can't find language: {}", language));
168 std::wstring_view BaseTextLocalization<wchar_t>::operator [](std::string_view key)
const
170 return this->getString(key, language);
174std::wstring to_wstring(std::string_view stringToConvert)
178 int size = MultiByteToWideChar
182 stringToConvert.data(),
190 throw std::runtime_error(
"Can't convert to wstring");
193 result.resize(
static_cast<size_t>(size) - 1);
195 if (!MultiByteToWideChar
199 stringToConvert.data(),
205 throw std::runtime_error(
"Can't convert to wstring");