2022-02-11 01:38:14 -05:00
|
|
|
#include "pch.h"
|
|
|
|
#include "locale.h"
|
|
|
|
#include <filesystem>
|
|
|
|
|
2022-03-04 01:08:06 -05:00
|
|
|
Locale::eReturnCodes Locale::Init(const char* path, const char* def, const char* fallback)
|
2022-02-11 01:38:14 -05:00
|
|
|
{
|
|
|
|
std::string localePath = path;
|
|
|
|
if (localePath.back() != '/')
|
|
|
|
{
|
|
|
|
localePath += '/';
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef _GTA_
|
|
|
|
m_path = PLUGIN_PATH((char*)localePath.c_str());
|
|
|
|
#else
|
|
|
|
m_path = localePath;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!std::filesystem::exists(m_path))
|
|
|
|
{
|
|
|
|
#ifdef _GTA_
|
2022-06-15 06:45:43 -04:00
|
|
|
Log::Print<eLogLevel::Error>("Locale directory doesn't exist");
|
2022-02-11 01:38:14 -05:00
|
|
|
#endif
|
|
|
|
return eReturnCodes::DIR_NOT_FOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Get the list of available languages
|
|
|
|
We won't load them here, we'll load them when we need them
|
|
|
|
*/
|
|
|
|
#ifdef _GTA_
|
2022-06-15 06:45:43 -04:00
|
|
|
Log::Print<eLogLevel::Info>("Loading languages...");
|
2022-02-11 01:38:14 -05:00
|
|
|
#endif
|
|
|
|
for (auto& entry : std::filesystem::directory_iterator(m_path))
|
|
|
|
{
|
2022-06-16 06:40:46 -04:00
|
|
|
if (entry.path().extension() == ".toml")
|
2022-02-11 01:38:14 -05:00
|
|
|
{
|
2022-03-03 15:55:19 -05:00
|
|
|
std::string fileName = entry.path().stem().string();
|
2022-02-11 01:38:14 -05:00
|
|
|
#ifdef _GTA_
|
2022-06-15 06:45:43 -04:00
|
|
|
Log::Print<eLogLevel::Info>("Found locale: {}", fileName);
|
2022-02-11 01:38:14 -05:00
|
|
|
#endif
|
2022-03-03 15:55:19 -05:00
|
|
|
m_locales.push_back(fileName);
|
|
|
|
|
2022-03-04 01:08:06 -05:00
|
|
|
if (!strcmp(fallback, fileName.c_str()))
|
2022-03-03 15:55:19 -05:00
|
|
|
{
|
2022-06-16 06:40:46 -04:00
|
|
|
std::string localePath = m_path + fileName;
|
2022-03-03 15:55:19 -05:00
|
|
|
|
2022-06-16 06:40:46 -04:00
|
|
|
if(m_pCallbackData)
|
2022-03-03 15:55:19 -05:00
|
|
|
{
|
2022-06-16 06:40:46 -04:00
|
|
|
delete m_pCallbackData;
|
|
|
|
m_pCallbackData = nullptr;
|
2022-03-03 15:55:19 -05:00
|
|
|
}
|
2022-06-16 06:40:46 -04:00
|
|
|
m_pCallbackData = new DataStore(localePath.c_str(), true);
|
2022-03-03 15:55:19 -05:00
|
|
|
}
|
2022-02-11 01:38:14 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(m_locales) == 0)
|
|
|
|
{
|
|
|
|
#ifdef _GTA_
|
2022-06-15 06:45:43 -04:00
|
|
|
Log::Print<eLogLevel::Error>("No language files found");
|
2022-02-11 01:38:14 -05:00
|
|
|
#endif
|
|
|
|
return eReturnCodes::NO_LOCALE_FOUND;
|
|
|
|
}
|
|
|
|
|
2022-02-11 16:35:08 -05:00
|
|
|
|
|
|
|
// Look for default language and set it
|
|
|
|
std::vector<std::string>& vec = Locale::GetLocaleList();
|
|
|
|
|
|
|
|
size_t index = 0;
|
|
|
|
for (std::string& locale : vec)
|
|
|
|
{
|
|
|
|
if (locale == def)
|
|
|
|
{
|
|
|
|
Locale::SetLocale(index);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
|
2022-06-15 06:45:43 -04:00
|
|
|
if(!m_pData)
|
2022-02-11 16:35:08 -05:00
|
|
|
{
|
|
|
|
#ifdef _GTA_
|
2022-06-15 06:45:43 -04:00
|
|
|
Log::Print<eLogLevel::Error>("Failed to load default language.");
|
2022-02-11 16:35:08 -05:00
|
|
|
#endif
|
|
|
|
return eReturnCodes::DEF_LOCALE_NOT_FOUND;
|
|
|
|
}
|
|
|
|
|
2022-02-11 01:38:14 -05:00
|
|
|
return eReturnCodes::SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<std::string>& Locale::GetLocaleList()
|
|
|
|
{
|
|
|
|
return m_locales;
|
|
|
|
}
|
|
|
|
|
2022-02-11 16:35:08 -05:00
|
|
|
size_t Locale::GetCurrentLocaleIndex()
|
2022-02-11 01:38:14 -05:00
|
|
|
{
|
2022-02-11 16:35:08 -05:00
|
|
|
return localeIndex;
|
2022-02-11 01:38:14 -05:00
|
|
|
}
|
|
|
|
|
2022-02-19 13:32:25 -05:00
|
|
|
Locale::eReturnCodes Locale::SetLocale(size_t index)
|
2022-02-11 01:38:14 -05:00
|
|
|
{
|
2022-06-15 06:45:43 -04:00
|
|
|
if(m_pData)
|
2022-02-11 01:38:14 -05:00
|
|
|
{
|
2022-06-15 06:45:43 -04:00
|
|
|
delete m_pData;
|
|
|
|
m_pData = nullptr;
|
2022-02-11 01:38:14 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (index < 0 || index >= m_locales.size())
|
|
|
|
{
|
|
|
|
return eReturnCodes::INVALID_INDEX;
|
|
|
|
}
|
2022-06-16 06:40:46 -04:00
|
|
|
std::string localePath = m_path + m_locales[index];
|
|
|
|
m_pData = new DataStore(localePath.c_str(), true);
|
2022-02-11 16:35:08 -05:00
|
|
|
localeIndex = index;
|
2022-02-11 01:38:14 -05:00
|
|
|
return eReturnCodes::SUCCESS;
|
|
|
|
}
|
|
|
|
|
2022-06-16 06:40:46 -04:00
|
|
|
std::string Locale::GetText(std::string&& key, std::string&& defaultValue)
|
|
|
|
{
|
|
|
|
if (m_pData == nullptr)
|
|
|
|
{
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return keyname if no default value is provided
|
|
|
|
if (defaultValue == "")
|
|
|
|
{
|
|
|
|
defaultValue = "#" + key;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string rtn = m_pData->Get(key.c_str(), defaultValue);
|
|
|
|
|
|
|
|
if (rtn == defaultValue)
|
|
|
|
{
|
|
|
|
return m_pCallbackData->Get(key.c_str(), defaultValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rtn;
|
|
|
|
}
|
|
|
|
|