ES-DE/es-core/src/utils/LocalizationUtil.cpp

93 lines
2.9 KiB
C++
Raw Normal View History

2024-06-29 19:24:28 +00:00
// SPDX-License-Identifier: MIT
//
// ES-DE Frontend
// LocalizationUtil.cpp
//
// Localization functions.
// Provides support for translations using gettext/libintl.
//
#include "utils/LocalizationUtil.h"
#include "Log.h"
#include "resources/ResourceManager.h"
#include "utils/StringUtil.h"
#include <algorithm>
#include <iostream>
namespace Utils
{
namespace Localization
{
std::string getLocale()
{
std::string language;
// The LANGUAGE environment variable takes precedence over LANG.
if (getenv("LANGUAGE") != nullptr)
language = getenv("LANGUAGE");
const std::vector<std::string> languageValues {
Utils::String::delimitedStringToVector(language, ":")};
for (auto value : languageValues) {
if (std::find(sSupportedLanguages.cbegin(), sSupportedLanguages.cend(), value) !=
sSupportedLanguages.cend()) {
return value;
}
}
if (getenv("LANG") != nullptr)
language = getenv("LANG");
if (language.empty())
return "en_US";
return language.substr(0, language.find("."));
}
void setLanguage(const std::string& locale)
{
if (std::find(sSupportedLanguages.cbegin(), sSupportedLanguages.cend(), locale) ==
sSupportedLanguages.cend()) {
LOG(LogInfo) << "No support for language \"" << locale
<< "\", reverting to default language \"en_US\"";
return;
}
else {
LOG(LogInfo) << "Setting application language to \"" << locale << "\"";
}
// No need to perform translations if we're using the default language.
if (locale == "en_US")
return;
std::string localePath;
localePath.append("/")
.append(locale)
.append("/LC_MESSAGES/")
.append(locale)
.append(".mo");
// If the message catalog file is not found then an emergency shutdown will be
// initiated by ResourceManager.
std::string objectPath {
ResourceManager::getInstance().getResourcePath(":/locale" + localePath)};
// This makes it possible to override the message catalog with a file in the
// application data directory.
if (objectPath.length() > localePath.length())
objectPath = objectPath.substr(0, objectPath.length() - localePath.length());
setenv("LANGUAGE", locale.c_str(), 1);
setlocale(LC_MESSAGES, "");
textdomain(locale.c_str());
bindtextdomain(locale.c_str(), objectPath.c_str());
bind_textdomain_codeset(locale.c_str(), "UTF-8");
}
} // namespace Localization
} // namespace Utils