lay down translations
This commit is contained in:
11
src/frontend/Language.cpp
Normal file
11
src/frontend/Language.cpp
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include <Language.hpp>
|
||||||
|
|
||||||
|
namespace Language {
|
||||||
|
void SetLanguage(const std::array<std::string, STRING_COUNT>& lang, int selectedLang) {
|
||||||
|
switch (selectedLang) {
|
||||||
|
case AvailableLangs::ENGLISH: std::copy(english.begin(), english.end(), lang.begin()); break;
|
||||||
|
case AvailableLangs::ITALIAN: std::copy(italian.begin(), italian.end(), lang.begin()); break;
|
||||||
|
default: Util::panic("Language not supported, index {}\n", selectedLang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
85
src/frontend/Language.hpp
Normal file
85
src/frontend/Language.hpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <log.hpp>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
namespace Language {
|
||||||
|
|
||||||
|
enum StringID {
|
||||||
|
MENU_FILE,
|
||||||
|
FILE_ITEM_OPEN,
|
||||||
|
FILE_ITEM_EXIT,
|
||||||
|
MENU_EMULATION,
|
||||||
|
EMULATION_ITEM_RESET,
|
||||||
|
EMULATION_ITEM_STOP,
|
||||||
|
EMULATION_ITEM_PAUSE,
|
||||||
|
EMULATION_ITEM_RESUME,
|
||||||
|
EMULATION_ITEM_SETTINGS,
|
||||||
|
SETTINGS_CATEGORY_CPU,
|
||||||
|
SETTINGS_CATEGORY_AUDIO,
|
||||||
|
SETTINGS_CATEGORY_INTERFACE,
|
||||||
|
SETTINGS_OPTION_MUTE,
|
||||||
|
SETTINGS_OPTION_VOLUME_L,
|
||||||
|
SETTINGS_OPTION_VOLUME_R,
|
||||||
|
SETTINGS_OPTION_LOCK_CHANNELS,
|
||||||
|
SETTINGS_OPTION_ENABLE_JIT,
|
||||||
|
SETTINGS_OPTION_LANGUAGE,
|
||||||
|
LANGUAGE_ENGLISH,
|
||||||
|
LANGUAGE_ITALIAN,
|
||||||
|
STRING_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::array<std::string, STRING_COUNT> english = {
|
||||||
|
"File",
|
||||||
|
"Open",
|
||||||
|
"Exit",
|
||||||
|
"Emulation",
|
||||||
|
"Reset",
|
||||||
|
"Stop",
|
||||||
|
"Pause",
|
||||||
|
"Resume",
|
||||||
|
"Settings",
|
||||||
|
"CPU",
|
||||||
|
"Audio",
|
||||||
|
"Interface",
|
||||||
|
"Mute",
|
||||||
|
"Volume L",
|
||||||
|
"Volume R",
|
||||||
|
"Lock channels",
|
||||||
|
"Enable JIT",
|
||||||
|
"Language"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::array<std::string, STRING_COUNT> italian = {
|
||||||
|
"File",
|
||||||
|
"Apri",
|
||||||
|
"Esci",
|
||||||
|
"Emulazione",
|
||||||
|
"Reset",
|
||||||
|
"Stop",
|
||||||
|
"Pausa",
|
||||||
|
"Riprendi",
|
||||||
|
"Impostazioni",
|
||||||
|
"CPU",
|
||||||
|
"Audio",
|
||||||
|
"Interfaccia",
|
||||||
|
"Muto",
|
||||||
|
"Volume L",
|
||||||
|
"Volume R",
|
||||||
|
"Blocca canali",
|
||||||
|
"Abilita JIT",
|
||||||
|
"Lingua"
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AvailableLangs {
|
||||||
|
ENGLISH,
|
||||||
|
ITALIAN,
|
||||||
|
AVAILABLE_LANGS_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::array<std::string, AVAILABLE_LANGS_COUNT> languages = {
|
||||||
|
"English",
|
||||||
|
"Italiano"
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetLanguage(const std::array<std::string, STRING_COUNT>& lang, int selectedLang);
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
#define checkjsonentry(name, type, param1, param2, defaultVal) \
|
#define checknestedjsonentry(name, type, param1, param2, defaultVal) \
|
||||||
do { \
|
do { \
|
||||||
auto name##Entry = settings[param1][param2]; \
|
auto name##Entry = settings[param1][param2]; \
|
||||||
if(!name##Entry.empty()) { \
|
if(!name##Entry.empty()) { \
|
||||||
@@ -20,6 +20,20 @@ namespace fs = std::filesystem;
|
|||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
#define checkjsonentry(name, type, param, defaultVal) \
|
||||||
|
do { \
|
||||||
|
auto name##Entry = settings[param]; \
|
||||||
|
if(!name##Entry.empty()) { \
|
||||||
|
auto value = name##Entry.get<type>(); \
|
||||||
|
(name) = value; \
|
||||||
|
} else { \
|
||||||
|
settingsFile.clear(); \
|
||||||
|
settings[param] = defaultVal; \
|
||||||
|
settingsFile << settings; \
|
||||||
|
(name) = defaultVal; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
Settings::Settings(n64::Core& core) {
|
Settings::Settings(n64::Core& core) {
|
||||||
auto fileExists = fs::exists("resources/settings.json");
|
auto fileExists = fs::exists("resources/settings.json");
|
||||||
@@ -28,13 +42,14 @@ Settings::Settings(n64::Core& core) {
|
|||||||
settingsFile = std::fstream("resources/settings.json", std::fstream::in | std::fstream::out);
|
settingsFile = std::fstream("resources/settings.json", std::fstream::in | std::fstream::out);
|
||||||
settings = json::parse(settingsFile);
|
settings = json::parse(settingsFile);
|
||||||
|
|
||||||
checkjsonentry(oldVolumeL, float, "audio", "volumeL", 0.5);
|
checknestedjsonentry(oldVolumeL, float, "audio", "volumeL", 0.5);
|
||||||
checkjsonentry(oldVolumeR, float, "audio", "volumeR", 0.5);
|
checknestedjsonentry(oldVolumeR, float, "audio", "volumeR", 0.5);
|
||||||
checkjsonentry(mute, bool, "audio", "mute", false);
|
checknestedjsonentry(mute, bool, "audio", "mute", false);
|
||||||
volumeL = mute ? 0 : oldVolumeL;
|
volumeL = mute ? 0 : oldVolumeL;
|
||||||
volumeR = mute ? 0 : oldVolumeR;
|
volumeR = mute ? 0 : oldVolumeR;
|
||||||
checkjsonentry(lockChannels, bool, "audio", "lockChannels", true);
|
checknestedjsonentry(lockChannels, bool, "audio", "lockChannels", true);
|
||||||
checkjsonentry(jit, bool, "cpu", "enableJIT", false);
|
checknestedjsonentry(jit, bool, "cpu", "enableJIT", false);
|
||||||
|
checkjsonentry(selectedLanguage, int, "language", Language::ENGLISH);
|
||||||
} else {
|
} else {
|
||||||
settingsFile = std::fstream("resources/settings.json", std::fstream::trunc | std::fstream::in | std::fstream::out);
|
settingsFile = std::fstream("resources/settings.json", std::fstream::trunc | std::fstream::in | std::fstream::out);
|
||||||
settings["audio"]["volumeR"] = 0.5;
|
settings["audio"]["volumeR"] = 0.5;
|
||||||
@@ -42,6 +57,7 @@ Settings::Settings(n64::Core& core) {
|
|||||||
settings["audio"]["lockChannels"] = true;
|
settings["audio"]["lockChannels"] = true;
|
||||||
settings["audio"]["mute"] = false;
|
settings["audio"]["mute"] = false;
|
||||||
settings["cpu"]["enableJIT"] = false;
|
settings["cpu"]["enableJIT"] = false;
|
||||||
|
settings["language"] = Language::ENGLISH;
|
||||||
|
|
||||||
oldVolumeR = volumeR = 0.5;
|
oldVolumeR = volumeR = 0.5;
|
||||||
oldVolumeL = volumeL = 0.5;
|
oldVolumeL = volumeL = 0.5;
|
||||||
@@ -52,6 +68,8 @@ Settings::Settings(n64::Core& core) {
|
|||||||
settingsFile << settings;
|
settingsFile << settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Language::SetLanguage(languageStrings, selectedLanguage);
|
||||||
|
|
||||||
if(jit) {
|
if(jit) {
|
||||||
core.cpu = std::make_unique<n64::JIT>();
|
core.cpu = std::make_unique<n64::JIT>();
|
||||||
} else {
|
} else {
|
||||||
@@ -74,6 +92,7 @@ Settings::~Settings() {
|
|||||||
settings["audio"]["lockChannels"] = lockChannels;
|
settings["audio"]["lockChannels"] = lockChannels;
|
||||||
settings["audio"]["mute"] = mute;
|
settings["audio"]["mute"] = mute;
|
||||||
settings["cpu"]["enableJIT"] = jit;
|
settings["cpu"]["enableJIT"] = jit;
|
||||||
|
settings["language"] = selectedLanguage;
|
||||||
settingsFile << settings;
|
settingsFile << settings;
|
||||||
|
|
||||||
settingsFile.close();
|
settingsFile.close();
|
||||||
@@ -82,38 +101,44 @@ Settings::~Settings() {
|
|||||||
void Settings::RenderWidget(bool& show) {
|
void Settings::RenderWidget(bool& show) {
|
||||||
if(show) {
|
if(show) {
|
||||||
ImGui::OpenPopup("Settings");
|
ImGui::OpenPopup("Settings");
|
||||||
if(ImGui::BeginPopupModal("Settings", &show)) {
|
if(ImGui::BeginPopupModal(languageStrings[Language::EMULATION_ITEM_SETTINGS].c_str(), &show)) {
|
||||||
enum class SelectedSetting { CPU, Audio, COUNT };
|
enum class SelectedSetting { CPU, Audio, Interface, COUNT };
|
||||||
static SelectedSetting selectedSetting = SelectedSetting::CPU;
|
static SelectedSetting selectedSetting = SelectedSetting::CPU;
|
||||||
const char *categories[(int)SelectedSetting::COUNT] = { "CPU", "Audio" };
|
const char *categories[(int)SelectedSetting::COUNT] = {
|
||||||
|
languageStrings[Language::SETTINGS_CATEGORY_CPU].c_str(),
|
||||||
|
languageStrings[Language::SETTINGS_CATEGORY_AUDIO].c_str(),
|
||||||
|
languageStrings[Language::SETTINGS_CATEGORY_INTERFACE].c_str() };
|
||||||
|
|
||||||
CreateComboList("##", (int*)&selectedSetting, categories, (int)SelectedSetting::COUNT);
|
CreateComboList("##", (int*)&selectedSetting, categories, (int)SelectedSetting::COUNT);
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
switch (selectedSetting) {
|
switch (selectedSetting) {
|
||||||
case SelectedSetting::Audio:
|
case SelectedSetting::Audio:
|
||||||
ImGui::Checkbox("Lock channels", &lockChannels);
|
ImGui::Checkbox(languageStrings[Language::SETTINGS_OPTION_LOCK_CHANNELS].c_str(), &lockChannels);
|
||||||
ImGui::Checkbox("Mute", &mute);
|
ImGui::Checkbox(languageStrings[Language::SETTINGS_OPTION_MUTE].c_str(), &mute);
|
||||||
if(mute) {
|
if(mute) {
|
||||||
volumeL = 0;
|
volumeL = 0;
|
||||||
volumeR = 0;
|
volumeR = 0;
|
||||||
|
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
ImGui::SliderFloat("Volume L", &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::SliderFloat(languageStrings[Language::SETTINGS_OPTION_VOLUME_L].c_str(), &oldVolumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
if (lockChannels) {
|
if (lockChannels) {
|
||||||
oldVolumeR = oldVolumeL;
|
oldVolumeR = oldVolumeL;
|
||||||
}
|
}
|
||||||
ImGui::SliderFloat("Volume R", &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::SliderFloat(languageStrings[Language::SETTINGS_OPTION_VOLUME_R].c_str(), &oldVolumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
volumeL = oldVolumeL;
|
volumeL = oldVolumeL;
|
||||||
volumeR = oldVolumeR;
|
volumeR = oldVolumeR;
|
||||||
|
|
||||||
ImGui::SliderFloat("Volume L", &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::SliderFloat(languageStrings[Language::SETTINGS_OPTION_VOLUME_L].c_str(), &volumeL, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
if (!lockChannels) {
|
if (!lockChannels) {
|
||||||
ImGui::SliderFloat("Volume R", &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::SliderFloat(languageStrings[Language::SETTINGS_OPTION_VOLUME_R].c_str(), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
volumeR = volumeL;
|
volumeR = volumeL;
|
||||||
ImGui::BeginDisabled();
|
ImGui::BeginDisabled();
|
||||||
ImGui::SliderFloat("Volume R", &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
ImGui::SliderFloat(languageStrings[Language::SETTINGS_OPTION_VOLUME_R].c_str(), &volumeR, 0, 1, "%.2f", ImGuiSliderFlags_NoInput);
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,8 +148,15 @@ void Settings::RenderWidget(bool& show) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case SelectedSetting::CPU:
|
case SelectedSetting::CPU:
|
||||||
ImGui::Checkbox("Enable JIT", &jit);
|
ImGui::Checkbox(languageStrings[Language::SETTINGS_OPTION_ENABLE_JIT].c_str(), &jit);
|
||||||
break;
|
break;
|
||||||
|
case SelectedSetting::Interface: {
|
||||||
|
const char* languages[Language::AVAILABLE_LANGS_COUNT] = {
|
||||||
|
Language::languages[0].c_str(),
|
||||||
|
Language::languages[1].c_str()
|
||||||
|
};
|
||||||
|
CreateComboList("##", &selectedLanguage, languages, Language::AVAILABLE_LANGS_COUNT);
|
||||||
|
} break;
|
||||||
case SelectedSetting::COUNT:
|
case SelectedSetting::COUNT:
|
||||||
Util::panic("BRUH");
|
Util::panic("BRUH");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include <common.hpp>
|
#include <Language.hpp>
|
||||||
|
|
||||||
namespace n64 { struct Core; }
|
namespace n64 { struct Core; }
|
||||||
using namespace nlohmann;
|
using namespace nlohmann;
|
||||||
@@ -19,5 +19,7 @@ private:
|
|||||||
float oldVolumeL, oldVolumeR;
|
float oldVolumeL, oldVolumeR;
|
||||||
bool lockChannels = true;
|
bool lockChannels = true;
|
||||||
bool mute = false;
|
bool mute = false;
|
||||||
|
int selectedLanguage = Language::ENGLISH;
|
||||||
|
std::array<std::string, Language::STRING_COUNT> languageStrings{};
|
||||||
json settings;
|
json settings;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ Window::Window(n64::Core& core) : settings(core) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Window::handleEvents(SDL_Event event, n64::Core& core) {
|
void Window::handleEvents(SDL_Event event, n64::Core& core) {
|
||||||
done = event.window.event == SDL_WINDOWEVENT_CLOSE
|
done = event.window.event == (int)SDL_WINDOWEVENT_CLOSE
|
||||||
&& event.window.windowID == SDL_GetWindowID(window);
|
&& event.window.windowID == SDL_GetWindowID(window);
|
||||||
|
|
||||||
bool minimized = SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED;
|
bool minimized = SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED;
|
||||||
core.pause = event.window.event == SDL_WINDOWEVENT_FOCUS_LOST || minimized;
|
core.pause = event.window.event == (int)SDL_WINDOWEVENT_FOCUS_LOST || minimized;
|
||||||
core.render = !minimized;
|
core.render = !minimized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user