mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-06-28 18:27:08 -04:00
130 lines
3.4 KiB
C++
130 lines
3.4 KiB
C++
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#include "i18.hpp"
|
|
|
|
namespace utils
|
|
{
|
|
namespace
|
|
{
|
|
auto returnNonEmptyString(const std::string &str, const std::string &ret) -> const std::string &
|
|
{
|
|
return str.empty() ? ret : str;
|
|
}
|
|
} // namespace
|
|
|
|
i18 localize;
|
|
json11::Json LangLoader::Create(Lang lang)
|
|
{
|
|
const char *path = nullptr;
|
|
|
|
switch (lang) {
|
|
case Lang::Pl:
|
|
path = langPL_path;
|
|
break;
|
|
case Lang::En:
|
|
path = langEN_path;
|
|
break;
|
|
case Lang::De:
|
|
path = langDE_path;
|
|
break;
|
|
case Lang::Sp:
|
|
path = langSP_path;
|
|
break;
|
|
|
|
default:
|
|
return json11::Json();
|
|
}
|
|
|
|
auto fd = vfs.fopen(path, "r");
|
|
if (fd == nullptr) {
|
|
LOG_FATAL("Error during opening file %s", path);
|
|
return json11::Json();
|
|
}
|
|
|
|
uint32_t fsize = vfs.filelength(fd);
|
|
|
|
auto stream = new char[fsize + 1]; // +1 for NULL terminator
|
|
|
|
memset(stream, 0, fsize + 1);
|
|
|
|
vfs.fread(stream, 1, fsize, fd);
|
|
|
|
std::string err;
|
|
json11::Json js = json11::Json::parse(stream, err);
|
|
|
|
delete[] stream;
|
|
vfs.fclose(fd);
|
|
|
|
// Error
|
|
if (err.length() != 0) {
|
|
LOG_FATAL("%s", err.c_str());
|
|
return json11::Json();
|
|
}
|
|
else {
|
|
return js;
|
|
}
|
|
}
|
|
|
|
void i18::setInputLanguage(Lang lang)
|
|
{
|
|
if (!input_init) {
|
|
backupLang = loader.Create(lang_default);
|
|
inputLang = backupLang;
|
|
input_init = true;
|
|
}
|
|
if (lang == inputCurrent) {
|
|
return;
|
|
}
|
|
inputCurrent = lang;
|
|
if (lang == lang_default) {
|
|
inputLang = backupLang;
|
|
}
|
|
else {
|
|
json11::Json pack = loader.Create(lang);
|
|
inputLang = pack;
|
|
}
|
|
}
|
|
const std::string &i18::getInputLanguage(const std::string &str)
|
|
{
|
|
// if language pack returned nothing then try default language
|
|
if (inputLang[str].string_value().empty()) {
|
|
return returnNonEmptyString(backupLang[str].string_value(), str);
|
|
}
|
|
return returnNonEmptyString(inputLang[str].string_value(), str);
|
|
}
|
|
|
|
const std::string &i18::get(const std::string &str)
|
|
{
|
|
// if language pack returned nothing then try default language
|
|
if (displayLang[str].string_value().empty()) {
|
|
return returnNonEmptyString(backupLang[str].string_value(), str);
|
|
}
|
|
return returnNonEmptyString(displayLang[str].string_value(), str);
|
|
}
|
|
|
|
void i18::SetDisplayLanguage(Lang lang)
|
|
{
|
|
if (!display_init) {
|
|
backupLang = loader.Create(lang_default);
|
|
displayLang = backupLang;
|
|
display_init = true;
|
|
}
|
|
if (lang == displayCurrent) {
|
|
return;
|
|
}
|
|
displayCurrent = lang;
|
|
if (lang == lang_default) {
|
|
displayLang = backupLang;
|
|
}
|
|
else {
|
|
json11::Json pack = loader.Create(lang);
|
|
// Suspend whole system during switching lang packs
|
|
vTaskSuspendAll();
|
|
displayLang = pack;
|
|
xTaskResumeAll();
|
|
}
|
|
}
|
|
|
|
} // namespace utils
|