Language settings menu
This commit is contained in:
+2
-1
@@ -28,8 +28,9 @@ settings.Fog Curve=Кривая Тумана
|
|||||||
settings.Backlight=Подсветка
|
settings.Backlight=Подсветка
|
||||||
settings.V-Sync=Вертикальная Синхронизация
|
settings.V-Sync=Вертикальная Синхронизация
|
||||||
|
|
||||||
FOV=Поле Зрения
|
settings.FOV=Поле Зрения
|
||||||
settings.Mouse Sensitivity=Чувствительность Мыши
|
settings.Mouse Sensitivity=Чувствительность Мыши
|
||||||
|
settings.Language=Язык
|
||||||
|
|
||||||
# Управление
|
# Управление
|
||||||
movement.forward=Вперёд
|
movement.forward=Вперёд
|
||||||
|
|||||||
+7
-4
@@ -34,6 +34,7 @@
|
|||||||
using std::unique_ptr;
|
using std::unique_ptr;
|
||||||
using std::shared_ptr;
|
using std::shared_ptr;
|
||||||
using std::string;
|
using std::string;
|
||||||
|
using std::vector;
|
||||||
using std::filesystem::path;
|
using std::filesystem::path;
|
||||||
using glm::vec3;
|
using glm::vec3;
|
||||||
using gui::GUI;
|
using gui::GUI;
|
||||||
@@ -60,15 +61,13 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths, Content* content)
|
|||||||
Audio::initialize();
|
Audio::initialize();
|
||||||
gui = new GUI();
|
gui = new GUI();
|
||||||
|
|
||||||
std::vector<const ContentPack*> packs;
|
|
||||||
auto resdir = paths->getResources();
|
auto resdir = paths->getResources();
|
||||||
auto base = std::make_unique<ContentPack>("base", resdir/path("content/base"));
|
contentPacks.push_back(ContentPack("base", resdir/path("content/base")));
|
||||||
packs.push_back(base.get());
|
|
||||||
|
|
||||||
if (settings.ui.language == "auto") {
|
if (settings.ui.language == "auto") {
|
||||||
settings.ui.language = platform::detect_locale();
|
settings.ui.language = platform::detect_locale();
|
||||||
}
|
}
|
||||||
langs::setup(resdir, settings.ui.language, packs);
|
langs::setup(resdir, settings.ui.language, contentPacks);
|
||||||
std::cout << "-- initializing finished" << std::endl;
|
std::cout << "-- initializing finished" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,6 +147,10 @@ const Content* Engine::getContent() const {
|
|||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<ContentPack>& Engine::getContentPacks() {
|
||||||
|
return contentPacks;
|
||||||
|
}
|
||||||
|
|
||||||
EnginePaths* Engine::getPaths() {
|
EnginePaths* Engine::getPaths() {
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
@@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "typedefs.h"
|
#include "typedefs.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include "content/ContentPack.h"
|
||||||
|
|
||||||
class Assets;
|
class Assets;
|
||||||
class Level;
|
class Level;
|
||||||
class Screen;
|
class Screen;
|
||||||
@@ -25,6 +28,7 @@ public:
|
|||||||
class Engine {
|
class Engine {
|
||||||
Assets* assets;
|
Assets* assets;
|
||||||
std::shared_ptr<Screen> screen = nullptr;
|
std::shared_ptr<Screen> screen = nullptr;
|
||||||
|
std::vector<ContentPack> contentPacks;
|
||||||
EngineSettings& settings;
|
EngineSettings& settings;
|
||||||
Content* content;
|
Content* content;
|
||||||
EnginePaths* paths;
|
EnginePaths* paths;
|
||||||
@@ -48,6 +52,7 @@ public:
|
|||||||
void setScreen(std::shared_ptr<Screen> screen);
|
void setScreen(std::shared_ptr<Screen> screen);
|
||||||
EnginePaths* getPaths();
|
EnginePaths* getPaths();
|
||||||
const Content* getContent() const;
|
const Content* getContent() const;
|
||||||
|
std::vector<ContentPack>& getContentPacks();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SRC_ENGINE_H_
|
#endif // SRC_ENGINE_H_
|
||||||
@@ -87,6 +87,13 @@ wstring Button::text() const {
|
|||||||
return L"";
|
return L"";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Button* Button::textSupplier(wstringsupplier supplier) {
|
||||||
|
if (label) {
|
||||||
|
Label* label = (Label*)(this->label.get());
|
||||||
|
label->textSupplier(supplier);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
void Button::drawBackground(Batch2D* batch, Assets* assets) {
|
void Button::drawBackground(Batch2D* batch, Assets* assets) {
|
||||||
vec2 coord = calcCoord();
|
vec2 coord = calcCoord();
|
||||||
batch->texture(nullptr);
|
batch->texture(nullptr);
|
||||||
@@ -112,6 +119,14 @@ Button* Button::listenAction(onaction action) {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Button::textAlign(Align align) {
|
||||||
|
if (label) {
|
||||||
|
Label* label = (Label*)(this->label.get());
|
||||||
|
label->align(align);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ================================ TextBox ===================================
|
// ================================ TextBox ===================================
|
||||||
TextBox::TextBox(wstring placeholder, vec4 padding)
|
TextBox::TextBox(wstring placeholder, vec4 padding)
|
||||||
: Panel(vec2(200,32), padding, 0, false),
|
: Panel(vec2(200,32), padding, 0, false),
|
||||||
|
|||||||
@@ -57,8 +57,12 @@ namespace gui {
|
|||||||
virtual void mouseRelease(GUI*, int x, int y) override;
|
virtual void mouseRelease(GUI*, int x, int y) override;
|
||||||
virtual Button* listenAction(onaction action);
|
virtual Button* listenAction(onaction action);
|
||||||
|
|
||||||
|
virtual void textAlign(Align align);
|
||||||
|
|
||||||
virtual void text(std::wstring text);
|
virtual void text(std::wstring text);
|
||||||
virtual std::wstring text() const;
|
virtual std::wstring text() const;
|
||||||
|
|
||||||
|
virtual Button* textSupplier(wstringsupplier supplier);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TextBox : public Panel {
|
class TextBox : public Panel {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using std::filesystem::path;
|
|||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
unique_ptr<langs::Lang> langs::current;
|
unique_ptr<langs::Lang> langs::current;
|
||||||
vector<langs::LocaleInfo> langs::locales_info;
|
unordered_map<string, langs::LocaleInfo> langs::locales_info;
|
||||||
|
|
||||||
langs::Lang::Lang(string locale) : locale(locale) {
|
langs::Lang::Lang(string locale) : locale(locale) {
|
||||||
}
|
}
|
||||||
@@ -34,6 +34,10 @@ void langs::Lang::put(const wstring& key, const wstring& text) {
|
|||||||
map[key] = text;
|
map[key] = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const string& langs::Lang::getId() const {
|
||||||
|
return locale;
|
||||||
|
}
|
||||||
|
|
||||||
/* Language key-value txt files parser */
|
/* Language key-value txt files parser */
|
||||||
class Reader : public BasicParser {
|
class Reader : public BasicParser {
|
||||||
void skipWhitespace() override {
|
void skipWhitespace() override {
|
||||||
@@ -84,14 +88,14 @@ void langs::loadLocalesInfo(const path& resdir, string& fallback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "locale " << entry.first << " (" << name << ") added" << std::endl;
|
std::cout << "locale " << entry.first << " (" << name << ") added" << std::endl;
|
||||||
langs::locales_info.push_back(LocaleInfo {entry.first, name});
|
langs::locales_info[entry.first] = LocaleInfo {entry.first, name};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void langs::load(const path& resdir,
|
void langs::load(const path& resdir,
|
||||||
const string& locale,
|
const string& locale,
|
||||||
vector<const ContentPack*>& packs,
|
const vector<ContentPack>& packs,
|
||||||
Lang& lang) {
|
Lang& lang) {
|
||||||
path filename = path(TEXTS_FOLDER)/path(locale + LANG_FILE_EXT);
|
path filename = path(TEXTS_FOLDER)/path(locale + LANG_FILE_EXT);
|
||||||
path core_file = resdir/filename;
|
path core_file = resdir/filename;
|
||||||
@@ -101,11 +105,11 @@ void langs::load(const path& resdir,
|
|||||||
reader.read(lang, "");
|
reader.read(lang, "");
|
||||||
}
|
}
|
||||||
for (auto pack : packs) {
|
for (auto pack : packs) {
|
||||||
path file = pack->getFolder()/filename;
|
path file = pack.getFolder()/filename;
|
||||||
if (fs::is_regular_file(file)) {
|
if (fs::is_regular_file(file)) {
|
||||||
string text = files::read_string(file);
|
string text = files::read_string(file);
|
||||||
Reader reader(file.string(), text);
|
Reader reader(file.string(), text);
|
||||||
reader.read(lang, pack->getId()+":");
|
reader.read(lang, pack.getId()+":");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +117,7 @@ void langs::load(const path& resdir,
|
|||||||
void langs::load(const path& resdir,
|
void langs::load(const path& resdir,
|
||||||
const string& locale,
|
const string& locale,
|
||||||
const string& fallback,
|
const string& fallback,
|
||||||
vector<const ContentPack*>& packs) {
|
const vector<ContentPack>& packs) {
|
||||||
unique_ptr<Lang> lang (new Lang(locale));
|
unique_ptr<Lang> lang (new Lang(locale));
|
||||||
load(resdir, fallback, packs, *lang.get());
|
load(resdir, fallback, packs, *lang.get());
|
||||||
load(resdir, locale, packs, *lang.get());
|
load(resdir, locale, packs, *lang.get());
|
||||||
@@ -122,7 +126,7 @@ void langs::load(const path& resdir,
|
|||||||
|
|
||||||
void langs::setup(const path& resdir,
|
void langs::setup(const path& resdir,
|
||||||
const string& locale,
|
const string& locale,
|
||||||
vector<const ContentPack*>& packs) {
|
const vector<ContentPack>& packs) {
|
||||||
string fallback = langs::FALLBACK_DEFAULT;
|
string fallback = langs::FALLBACK_DEFAULT;
|
||||||
langs::loadLocalesInfo(resdir, fallback);
|
langs::loadLocalesInfo(resdir, fallback);
|
||||||
langs::load(resdir, locale, fallback, packs);
|
langs::load(resdir, locale, fallback, packs);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
class ContentPack;
|
#include "../../content/ContentPack.h"
|
||||||
|
|
||||||
namespace langs {
|
namespace langs {
|
||||||
const char LANG_FILE_EXT[] = ".txt";
|
const char LANG_FILE_EXT[] = ".txt";
|
||||||
@@ -32,6 +32,8 @@ namespace langs {
|
|||||||
|
|
||||||
const std::wstring& get(const std::wstring& key) const;
|
const std::wstring& get(const std::wstring& key) const;
|
||||||
void put(const std::wstring& key, const std::wstring& text);
|
void put(const std::wstring& key, const std::wstring& text);
|
||||||
|
|
||||||
|
const std::string& getId() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LocaleInfo {
|
struct LocaleInfo {
|
||||||
@@ -40,7 +42,7 @@ namespace langs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern std::unique_ptr<Lang> current;
|
extern std::unique_ptr<Lang> current;
|
||||||
extern std::vector<LocaleInfo> locales_info;
|
extern std::unordered_map<std::string, LocaleInfo> locales_info;
|
||||||
|
|
||||||
extern void loadLocalesInfo(
|
extern void loadLocalesInfo(
|
||||||
const std::filesystem::path& resdir,
|
const std::filesystem::path& resdir,
|
||||||
@@ -48,12 +50,12 @@ namespace langs {
|
|||||||
|
|
||||||
extern void load(const std::filesystem::path& resdir,
|
extern void load(const std::filesystem::path& resdir,
|
||||||
const std::string& locale,
|
const std::string& locale,
|
||||||
std::vector<const ContentPack*>& packs,
|
const std::vector<ContentPack>& packs,
|
||||||
Lang& lang);
|
Lang& lang);
|
||||||
extern void load(const std::filesystem::path& resdir,
|
extern void load(const std::filesystem::path& resdir,
|
||||||
const std::string& locale,
|
const std::string& locale,
|
||||||
const std::string& fallback,
|
const std::string& fallback,
|
||||||
std::vector<const ContentPack*>& packs);
|
const std::vector<ContentPack>& packs);
|
||||||
|
|
||||||
extern const std::wstring& get(const std::wstring& key);
|
extern const std::wstring& get(const std::wstring& key);
|
||||||
extern const std::wstring& get(const std::wstring& key,
|
extern const std::wstring& get(const std::wstring& key,
|
||||||
@@ -61,7 +63,7 @@ namespace langs {
|
|||||||
|
|
||||||
extern void setup(const std::filesystem::path& resdir,
|
extern void setup(const std::filesystem::path& resdir,
|
||||||
const std::string& locale,
|
const std::string& locale,
|
||||||
std::vector<const ContentPack*>& packs);
|
const std::vector<ContentPack>& packs);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // FRONTEND_LOCALE_LANGS_H
|
#endif // FRONTEND_LOCALE_LANGS_H
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "../settings.h"
|
#include "../settings.h"
|
||||||
#include "../content/Content.h"
|
#include "../content/Content.h"
|
||||||
#include "../content/ContentLUT.h"
|
#include "../content/ContentLUT.h"
|
||||||
|
#include "../content/ContentPack.h"
|
||||||
|
|
||||||
#include "gui/gui_util.h"
|
#include "gui/gui_util.h"
|
||||||
#include "locale/langs.h"
|
#include "locale/langs.h"
|
||||||
@@ -37,6 +38,12 @@ using std::filesystem::u8path;
|
|||||||
using std::filesystem::directory_iterator;
|
using std::filesystem::directory_iterator;
|
||||||
using namespace gui;
|
using namespace gui;
|
||||||
|
|
||||||
|
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu);
|
||||||
|
Panel* create_new_world_panel(Engine* engine, PagesControl* menu);
|
||||||
|
Panel* create_controls_panel(Engine* engine, PagesControl* menu);
|
||||||
|
Panel* create_settings_panel(Engine* engine, PagesControl* menu);
|
||||||
|
Panel* create_pause_panel(Engine* engine, PagesControl* menu);
|
||||||
|
Panel* create_languages_panel(Engine* engine, PagesControl* menu);
|
||||||
|
|
||||||
void show_content_missing(GUI* gui, const Content* content, ContentLUT* lut) {
|
void show_content_missing(GUI* gui, const Content* content, ContentLUT* lut) {
|
||||||
PagesControl* menu = gui->getMenu();
|
PagesControl* menu = gui->getMenu();
|
||||||
@@ -91,6 +98,42 @@ void show_convert_request(GUI* gui, const Content* content, ContentLUT* lut,
|
|||||||
}, L"", langs::get(L"Cancel"));
|
}, L"", langs::get(L"Cancel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void create_menus(Engine* engine, PagesControl* menu) {
|
||||||
|
menu->add("new-world", create_new_world_panel(engine, menu));
|
||||||
|
menu->add("settings", create_settings_panel(engine, menu));
|
||||||
|
menu->add("controls", create_controls_panel(engine, menu));
|
||||||
|
menu->add("pause", create_pause_panel(engine, menu));
|
||||||
|
menu->add("languages", create_languages_panel(engine, menu));
|
||||||
|
menu->add("main", create_main_menu_panel(engine, menu));
|
||||||
|
}
|
||||||
|
|
||||||
|
Panel* create_languages_panel(Engine* engine, PagesControl* menu) {
|
||||||
|
Panel* panel = new Panel(vec2(400, 200), vec4(5.0f), 1.0f);
|
||||||
|
panel->scrollable(true);
|
||||||
|
std::vector<string> locales;
|
||||||
|
for (auto& entry : langs::locales_info) {
|
||||||
|
locales.push_back(entry.first);
|
||||||
|
}
|
||||||
|
std::sort(locales.begin(), locales.end());
|
||||||
|
for (string& name : locales) {
|
||||||
|
auto& locale = langs::locales_info.at(name);
|
||||||
|
string& fullName = locale.name;
|
||||||
|
|
||||||
|
Button* button = new Button(util::str2wstr_utf8(fullName), vec4(10.f));
|
||||||
|
button->listenAction([=](GUI*) {
|
||||||
|
auto resdir = engine->getPaths()->getResources();
|
||||||
|
langs::setup(resdir, name, engine->getContentPacks());
|
||||||
|
engine->getSettings().ui.language = name;
|
||||||
|
create_menus(engine, menu);
|
||||||
|
menu->back();
|
||||||
|
});
|
||||||
|
panel->add(button);
|
||||||
|
}
|
||||||
|
panel->add(guiutil::backButton(menu));
|
||||||
|
panel->refresh();
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
Panel* create_main_menu_panel(Engine* engine, PagesControl* menu) {
|
||||||
EnginePaths* paths = engine->getPaths();
|
EnginePaths* paths = engine->getPaths();
|
||||||
|
|
||||||
@@ -384,6 +427,14 @@ Panel* create_settings_panel(Engine* engine, PagesControl* menu) {
|
|||||||
panel->add(checkpanel);
|
panel->add(checkpanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
string langName = langs::locales_info.at(langs::current->getId()).name;
|
||||||
|
panel->add(guiutil::gotoButton(
|
||||||
|
langs::get(L"Language", L"settings")+L": "+
|
||||||
|
util::str2wstr_utf8(langName),
|
||||||
|
"languages", menu));
|
||||||
|
}
|
||||||
|
|
||||||
panel->add(guiutil::gotoButton(langs::get(L"Controls", L"menu"), "controls", menu));
|
panel->add(guiutil::gotoButton(langs::get(L"Controls", L"menu"), "controls", menu));
|
||||||
panel->add(guiutil::backButton(menu));
|
panel->add(guiutil::backButton(menu));
|
||||||
panel->refresh();
|
panel->refresh();
|
||||||
|
|||||||
+1
-6
@@ -4,14 +4,9 @@
|
|||||||
class Engine;
|
class Engine;
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
class Panel;
|
|
||||||
class PagesControl;
|
class PagesControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
gui::Panel* create_main_menu_panel(Engine* engine, gui::PagesControl* menu);
|
void create_menus(Engine* engine, gui::PagesControl* menu);
|
||||||
gui::Panel* create_new_world_panel(Engine* engine, gui::PagesControl* menu);
|
|
||||||
gui::Panel* create_controls_panel(Engine* engine, gui::PagesControl* menu);
|
|
||||||
gui::Panel* create_settings_panel(Engine* engine, gui::PagesControl* menu);
|
|
||||||
gui::Panel* create_pause_panel(Engine* engine, gui::PagesControl* menu);
|
|
||||||
|
|
||||||
#endif // FRONTEND_MENU_H_
|
#endif // FRONTEND_MENU_H_
|
||||||
@@ -45,16 +45,7 @@ MenuScreen::MenuScreen(Engine* engine_) : Screen(engine_) {
|
|||||||
auto menu = engine->getGUI()->getMenu();
|
auto menu = engine->getGUI()->getMenu();
|
||||||
|
|
||||||
// Create pages if not created yet
|
// Create pages if not created yet
|
||||||
if (!menu->has("new-world"))
|
create_menus(engine, menu);
|
||||||
menu->add("new-world", create_new_world_panel(engine, menu));
|
|
||||||
if (!menu->has("settings"))
|
|
||||||
menu->add("settings", create_settings_panel(engine, menu));
|
|
||||||
if (!menu->has("controls"))
|
|
||||||
menu->add("controls", create_controls_panel(engine, menu));
|
|
||||||
if (!menu->has("pause"))
|
|
||||||
menu->add("pause", create_pause_panel(engine, menu));
|
|
||||||
|
|
||||||
menu->add("main", create_main_menu_panel(engine, menu));
|
|
||||||
menu->reset();
|
menu->reset();
|
||||||
menu->set("main");
|
menu->set("main");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user