From e5c0819c3a0a5a51637af840b3ee67b9a21a0881 Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Mon, 25 Nov 2024 10:22:32 -0500 Subject: [PATCH] Add "Help > Language" menu item to select language setting. --- Makefile | 2 +- include/string.hpp | 1 + src/app/MenuBar.cpp | 30 ++++++++++++++++++++++++------ src/string.cpp | 15 ++++++++++++++- translations/en.json | 8 +++++++- translations/ja.json | 9 +++++++++ 6 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 translations/ja.json diff --git a/Makefile b/Makefile index cabb2e53..c856fce3 100644 --- a/Makefile +++ b/Makefile @@ -172,7 +172,7 @@ else endif DIST_MD := $(wildcard *.md) DIST_HTML := $(patsubst %.md, build/%.html, $(DIST_MD)) -DIST_RES := res cacert.pem Core.json template.vcv LICENSE-GPLv3.txt $(DIST_HTML) +DIST_RES := res cacert.pem Core.json template.vcv LICENSE-GPLv3.txt $(DIST_HTML) translations DIST_SDK_DIR := Rack-SDK DIST_SDK = Rack-SDK-$(VERSION)-$(ARCH_NAME).zip diff --git a/include/string.hpp b/include/string.hpp index 991d4efb..99213de6 100644 --- a/include/string.hpp +++ b/include/string.hpp @@ -133,6 +133,7 @@ struct Version { std::string translate(const std::string& id); std::string translate(const std::string& id, const std::string& language); +std::vector getLanguages(); void init(); diff --git a/src/app/MenuBar.cpp b/src/app/MenuBar.cpp index 1fdafa41..d3be99c9 100644 --- a/src/app/MenuBar.cpp +++ b/src/app/MenuBar.cpp @@ -982,6 +982,24 @@ struct HelpButton : MenuButton { menu->cornerFlags = BND_CORNER_TOP; menu->box.pos = getAbsoluteOffset(math::Vec(0, box.size.y)); + // Language + std::vector languages = string::getLanguages(); + std::vector languageLabels; + for (const std::string& language : languages) { + languageLabels.push_back(string::translate("language", language)); + } + menu->addChild(createIndexSubmenuItem("🌐 Language", languageLabels, [=]() { + auto it = std::find(languages.begin(), languages.end(), settings::language); + return it - languages.begin(); + }, [=](size_t i) { + settings::language = get(languages, i, "en"); + // Request restart + std::string msg = string::f("Rack must be restarted to change display language to %s. Restart Rack now?", string::translate("language").c_str()); + if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, msg.c_str())) { + APP->window->close(); + } + })); + menu->addChild(createMenuItem("Tips", "", [=]() { APP->scene->addChild(tipWindowCreate()); })); @@ -1097,27 +1115,27 @@ struct MenuBar : widget::OpaqueWidget { addChild(layout); FileButton* fileButton = new FileButton; - fileButton->text = "File"; + fileButton->text = string::translate("MenuBar.file"); layout->addChild(fileButton); EditButton* editButton = new EditButton; - editButton->text = "Edit"; + editButton->text = string::translate("MenuBar.edit"); layout->addChild(editButton); ViewButton* viewButton = new ViewButton; - viewButton->text = "View"; + viewButton->text = string::translate("MenuBar.view"); layout->addChild(viewButton); EngineButton* engineButton = new EngineButton; - engineButton->text = "Engine"; + engineButton->text = string::translate("MenuBar.engine"); layout->addChild(engineButton); LibraryButton* libraryButton = new LibraryButton; - libraryButton->text = "Library"; + libraryButton->text = string::translate("MenuBar.library"); layout->addChild(libraryButton); HelpButton* helpButton = new HelpButton; - helpButton->text = "Help"; + helpButton->text = string::translate("MenuBar.help"); layout->addChild(helpButton); infoLabel = new InfoLabel; diff --git a/src/string.cpp b/src/string.cpp index f5ca9161..ea752e01 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -383,7 +383,7 @@ std::string translate(const std::string& id) { std::string translate(const std::string& id, const std::string& language) { - auto it = translations.find(language); + const auto it = translations.find(language); if (it == translations.end()) return ""; @@ -392,6 +392,19 @@ std::string translate(const std::string& id, const std::string& language) { } +std::vector getLanguages() { + std::vector languages; + for (const auto& pair : translations) { + languages.push_back(pair.first); + } + // Sort by language name, by UTF-8 bytes + std::sort(languages.begin(), languages.end(), [](const std::string& a, const std::string& b) { + return translate("language", a) < translate("language", b); + }); + return languages; +} + + void init() { loadTranslations(); } diff --git a/translations/en.json b/translations/en.json index 641c8ba2..722fc798 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1,3 +1,9 @@ { - "language": "English" + "language": "English", + "MenuBar.file": "File", + "MenuBar.edit": "Edit", + "MenuBar.view": "View", + "MenuBar.engine": "Engine", + "MenuBar.library": "Library", + "MenuBar.help": "Help" } \ No newline at end of file diff --git a/translations/ja.json b/translations/ja.json new file mode 100644 index 00000000..05726696 --- /dev/null +++ b/translations/ja.json @@ -0,0 +1,9 @@ +{ + "language": "ζ—₯本θͺž", + "MenuBar.file": "フゑむル", + "MenuBar.edit": "編集", + "MenuBar.view": "葨瀺", + "MenuBar.engine": "エンジン", + "MenuBar.library": "ラむブラγƒͺ", + "MenuBar.help": "γƒ˜γƒ«γƒ—" +} \ No newline at end of file