ServiceMenu: afegida opció per a canviar el idioma

This commit is contained in:
2025-06-12 13:50:05 +02:00
parent e6f4e27fbd
commit f9b576ea25
14 changed files with 307 additions and 109 deletions

View File

@@ -2,6 +2,8 @@
#include <fstream>
#include <unordered_map>
#include "json.hpp"
#include "options.h"
#include "asset.h"
using json = nlohmann::json;
@@ -9,6 +11,12 @@ namespace lang
{
std::unordered_map<std::string, std::string> texts;
// Vector con los idiomas soportados
std::vector<Language> languages = {
{Code::SPANISH, "Castellano", "es_ES.json"},
{Code::VALENCIAN, "Balooncia", "ba_BA.json"},
{Code::ENGLISH, "Ingles", "en_UK.json"}};
// Inicializa los textos del juego en el idioma seleccionado
bool loadFromFile(const std::string &file_path)
{
@@ -50,8 +58,81 @@ namespace lang
// Obtiene el código del siguiente idioma disponible
Code getNextLangCode(Code lang)
{
auto index = static_cast<int>(lang);
index = (index + 1) % 3;
return static_cast<Code>(index);
for (size_t i = 0; i < languages.size(); ++i)
{
if (languages[i].code == lang)
{
return languages[(i + 1) % languages.size()].code;
}
}
// Si no se encuentra, devuelve el primero por defecto
return languages[0].code;
}
// Obtiene un idioma del vector de idiomas a partir de un código
Language getLanguage(Code code)
{
for (const auto &lang : languages)
{
if (lang.code == code)
return lang;
}
// Si no se encuentra, devuelve el primero por defecto
return languages[0];
}
// Devuelve el código de un idioma a partir de un nombre
Code getCodeFromName(const std::string& name)
{
for (const auto& lang : languages)
{
if (lang.name == name)
return lang.code;
}
// Si no se encuentra, devuelve el primero por defecto
return languages[0].code;
}
// Actualiza los nombres de los idiomas
void updateLanguageNames()
{
for (auto &lang : languages)
{
switch (lang.code)
{
case Code::SPANISH:
lang.name = lang::getText("[SERVICE_MENU] LANG ES");
break;
case Code::VALENCIAN:
lang.name = lang::getText("[SERVICE_MENU] LANG BA");
break;
case Code::ENGLISH:
lang.name = lang::getText("[SERVICE_MENU] LANG EN");
break;
default:
lang.name = "Unknown";
break;
}
}
}
// Obtiene una fichero a partir de un lang::Code
std::string getLanguageFileName(lang::Code code)
{
for (const auto &lang : languages)
{
if (lang.code == code)
return Asset::get()->get(lang.file_name);
}
// Si no se encuentra, devuelve el fichero del primer idioma por defecto
return Asset::get()->get(languages[0].file_name);
}
// Establece el idioma
void setLanguage(Code lang)
{
options.game.language = lang;
loadFromFile(Asset::get()->get(getLanguage(lang).file_name));
updateLanguageNames();
}
}