From f513a9eba3bbbbc0e7fd53da09e790543710d359 Mon Sep 17 00:00:00 2001 From: Ivan Gagis Date: Sun, 6 Oct 2024 16:57:16 +0300 Subject: [PATCH] en localization --- res/localization/en.tml | 50 +++++++++++++++++++ res/localization/fi.tml | 20 ++++++++ res/localization/ru.tml | 20 ++++++++ src/bedsidemon/about_menu.cpp | 11 ++-- src/bedsidemon/application.cpp | 21 ++++++-- src/bedsidemon/application.hpp | 4 ++ src/bedsidemon/menu.cpp | 2 +- src/bedsidemon/menu.hpp | 2 +- src/bedsidemon/settings_menu.cpp | 35 +++++++++---- src/bedsidemon/spo2/spo2_parameter_window.cpp | 13 ++--- src/bedsidemon/spo2/spo2_parameter_window.hpp | 2 +- .../spo2/spo2_parameter_window_menu.cpp | 4 +- 12 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 res/localization/en.tml create mode 100644 res/localization/fi.tml create mode 100644 res/localization/ru.tml diff --git a/res/localization/en.tml b/res/localization/en.tml new file mode 100644 index 0000000..13fbecd --- /dev/null +++ b/res/localization/en.tml @@ -0,0 +1,50 @@ +vocabulary{ + settings_menu_title{ + str{Settings} + } + + sweep_speed_setting_title{ + str{"Sweep speed:"} + } + + mm_per_sec{ + str{"mm/s"} + } + + language_setting_title{ + str{"Language:"} + } + + spo2_settings_menu_title{ + str{"SpO2 settings"} + } + + waveform_color_setting_title{ + str{"Color:"} + } + + about_menu_title{ + str{"About"} + } + + about_menu:program_title{ + str{"Bedside Patient Monitor DEMO program"} + } + + about_menu:version{ + str{"Version"} + } + + about_menu:powered_by{ + str{"Powered by"} + } + + about_menu:copyright{ + str{"Copyright"} + } + + spo2_simulation{ + str{"SpO2 %, SIMULATION"} + } + +} diff --git a/res/localization/fi.tml b/res/localization/fi.tml new file mode 100644 index 0000000..d7d6026 --- /dev/null +++ b/res/localization/fi.tml @@ -0,0 +1,20 @@ +vocabulary{ + sliders{ + str{liukusäädin} + } + image{ + str{kuva} + } + selection_box{ + str{"valintalaatikko"} + } + hello_world{ + str{"Hei maailman!"} + } + some_checkbox{ + str{"jokin valintaruutu"} + } + language{ + str{"Kieli (Language):"} + } +} diff --git a/res/localization/ru.tml b/res/localization/ru.tml new file mode 100644 index 0000000..1c65a34 --- /dev/null +++ b/res/localization/ru.tml @@ -0,0 +1,20 @@ +vocabulary{ + sliders{ + str{ползунки} + } + image{ + str{изображение} + } + selection_box{ + str{"выпадающее меню выбора"} + } + hello_world{ + str{"Превед медвед!"} + } + some_checkbox{ + str{"какая-то галочка"} + } + language{ + str{"Язык (Language):"} + } +} diff --git a/src/bedsidemon/about_menu.cpp b/src/bedsidemon/about_menu.cpp index 3982e99..09dec28 100644 --- a/src/bedsidemon/about_menu.cpp +++ b/src/bedsidemon/about_menu.cpp @@ -27,6 +27,7 @@ along with this program. If not, see . #include "style.hpp" using namespace std::string_literals; +using namespace std::string_view_literals; using namespace ruis::length_literals; @@ -54,7 +55,7 @@ std::vector> make_contents(utki::shared_ref> make_contents(utki::shared_ref> make_contents(utki::shared_ref> make_contents(utki::shared_ref"s + std::u32string(c.get().localization.get("about_menu:copyright").string()).append(U" © 2024 Gagistech Oy "sv) ) }; // clang-format on @@ -132,7 +133,7 @@ about_menu::about_menu(utki::shared_ref context) : ), menu( this->context, // - U"About"s, + this->context.get().localization.get("about_menu_title"), make_contents(this->context) ) {} diff --git a/src/bedsidemon/application.cpp b/src/bedsidemon/application.cpp index 4cc0a5d..c7cd6dc 100644 --- a/src/bedsidemon/application.cpp +++ b/src/bedsidemon/application.cpp @@ -52,13 +52,16 @@ application::application(bool window, std::string_view res_path) : ruisapp::window_params wp(r4::vector2(1024, 600)); return wp; }() - ) + ), + res_path(papki::as_dir(res_path)) { this->set_fullscreen(!window); this->gui.init_standard_widgets(*this->get_res_file()); - this->gui.context.get().loader.mount_res_pack(*this->get_res_file(papki::as_dir(res_path))); + this->gui.context.get().loader.mount_res_pack(*this->get_res_file(this->res_path)); + + this->load_language(this->settings_storage.get().cur_language_index); auto c = make_root_widgets(this->gui.context); @@ -97,7 +100,10 @@ application::application(bool window, std::string_view res_path) : // add fake sensor { - auto pw = utki::make_shared(this->gui.context, U"SpO2 %, simulated"); + auto pw = utki::make_shared( + this->gui.context, // + this->gui.context.get().localization.get("spo2_simulation") + ); this->fake_spo2_sensor_v = std::make_unique(pw, utki::cat(papki::as_dir(res_path), "spo2_measurements.tml")); @@ -188,3 +194,12 @@ void bedsidemon::application::close_menu() this->menu->on_close(); this->menu.reset(); } + +void application::load_language(size_t index) +{ + auto lng = settings::language_id_to_name_mapping.at(index).first; + + this->gui.context.get().localization = + ruis::localization(tml::read(*this->get_res_file(utki::cat(this->res_path, "localization/", lng, ".tml")))); + this->gui.get_root().reload(); +} diff --git a/src/bedsidemon/application.hpp b/src/bedsidemon/application.hpp index 0c30894..3e965f4 100644 --- a/src/bedsidemon/application.hpp +++ b/src/bedsidemon/application.hpp @@ -45,6 +45,8 @@ class application : public ruisapp::application public: bedsidemon::settings_storage settings_storage; + const std::string res_path; + application(bool window, std::string_view res_path); static application& inst() @@ -55,6 +57,8 @@ class application : public ruisapp::application void open_menu(utki::shared_ref menu); void close_menu(); + + void load_language(size_t index); }; std::unique_ptr create_application(std::string_view executable, utki::span args); diff --git a/src/bedsidemon/menu.cpp b/src/bedsidemon/menu.cpp index d859db9..570050a 100644 --- a/src/bedsidemon/menu.cpp +++ b/src/bedsidemon/menu.cpp @@ -41,7 +41,7 @@ constexpr auto size_close_button = 40_pp; menu::menu( utki::shared_ref context, // - std::u32string title, + ruis::string title, utki::span> contents ) : // clang-format off diff --git a/src/bedsidemon/menu.hpp b/src/bedsidemon/menu.hpp index 48129b2..946cf0e 100644 --- a/src/bedsidemon/menu.hpp +++ b/src/bedsidemon/menu.hpp @@ -30,7 +30,7 @@ class menu : public ruis::nine_patch public: menu( utki::shared_ref context, // - std::u32string title, + ruis::string title, utki::span> contents ); diff --git a/src/bedsidemon/settings_menu.cpp b/src/bedsidemon/settings_menu.cpp index c8d64aa..2c1f99c 100644 --- a/src/bedsidemon/settings_menu.cpp +++ b/src/bedsidemon/settings_menu.cpp @@ -86,7 +86,7 @@ class sweep_speed_selection_box_provider : public ruis::selection_box::provider .font_size = style::font_size_setting } }, - utki::to_utf32(utki::cat(speed_mm_per_sec, " mm/s"sv)) + utki::to_utf32(utki::cat(speed_mm_per_sec, ' ')).append(c.get().localization.get("mm_per_sec").string()) ) } ); @@ -95,7 +95,7 @@ class sweep_speed_selection_box_provider : public ruis::selection_box::provider }; } // namespace -namespace{ +namespace { class language_selection_box_provider : public ruis::selection_box::provider { public: @@ -140,7 +140,7 @@ class language_selection_box_provider : public ruis::selection_box::provider // clang-format on } }; -} +} // namespace namespace { std::vector> make_menu_contents(utki::shared_ref c) @@ -163,13 +163,26 @@ std::vector> make_menu_contents(utki::shared_ref< constexpr const auto& lang_mapping = settings::language_id_to_name_mapping; language_selection_box.get().selection_handler = [](ruis::selection_box& sb) { - auto& ss = settings_storage::inst(); - auto s = ss.get(); + auto sel = sb.get_selection(); + + // save the language to settings storage + { + auto& ss = settings_storage::inst(); + auto s = ss.get(); - ASSERT(sb.get_selection() < lang_mapping.size()) - s.cur_language_index = sb.get_selection(); + ASSERT(sel < lang_mapping.size()) + s.cur_language_index = sel; - ss.set(s); + ss.set(s); + } + + // reload the ui + { + sb.context.get().post_to_ui_thread([sel]() { + auto& app = bedsidemon::application::inst(); + app.load_language(sel); + }); + } }; auto& ss = settings_storage::inst(); @@ -190,7 +203,7 @@ std::vector> make_menu_contents(utki::shared_ref< .font_size = style::font_size_setting } }, - U"Sweep speed:"s + c.get().localization.get("sweep_speed_setting_title") ), m::gap(c, { @@ -229,7 +242,7 @@ std::vector> make_menu_contents(utki::shared_ref< .font_size = style::font_size_setting } }, - U"Language:"s + c.get().localization.get("language_setting_title") ), m::gap(c, { @@ -254,7 +267,7 @@ settings_menu::settings_menu(utki::shared_ref context) : ), menu( this->context, // - U"Settings"s, + this->context.get().localization.get("settings_menu_title"), make_menu_contents(this->context) ) { diff --git a/src/bedsidemon/spo2/spo2_parameter_window.cpp b/src/bedsidemon/spo2/spo2_parameter_window.cpp index d7d83b7..c25b1be 100644 --- a/src/bedsidemon/spo2/spo2_parameter_window.cpp +++ b/src/bedsidemon/spo2/spo2_parameter_window.cpp @@ -59,10 +59,7 @@ constexpr auto font_size_secondary_value = 40_pp; constexpr auto heart_size = 15_pp; -std::vector> make_numeric_content( - utki::shared_ref c, - std::u32string title -) +std::vector> make_numeric_content(utki::shared_ref c, ruis::string title) { // clang-format off return { @@ -133,7 +130,7 @@ std::vector> make_numeric_content( // clang-format on } -std::vector> make_widgets(utki::shared_ref c, std::u32string title) +std::vector> make_widgets(utki::shared_ref c, ruis::string title) { // clang-format off return { @@ -204,7 +201,7 @@ std::vector> make_widgets(utki::shared_ref> make_widgets(utki::shared_ref context, std::u32string title) : +spo2_parameter_window::spo2_parameter_window(utki::shared_ref context, ruis::string title) : ruis::widget( // std::move(context), {// @@ -247,7 +244,7 @@ spo2_parameter_window::spo2_parameter_window(utki::shared_ref con {// .layout = ruis::layout::row }}, - make_widgets(this->context, title) + make_widgets(this->context, std::move(title)) ), spo2_value(this->get_widget_as("spo2_value")), bpm_value(this->get_widget_as("bpm_value")), diff --git a/src/bedsidemon/spo2/spo2_parameter_window.hpp b/src/bedsidemon/spo2/spo2_parameter_window.hpp index 9bcaeaa..4948140 100644 --- a/src/bedsidemon/spo2/spo2_parameter_window.hpp +++ b/src/bedsidemon/spo2/spo2_parameter_window.hpp @@ -57,7 +57,7 @@ class spo2_parameter_window : std::shared_ptr pw_menu; public: - spo2_parameter_window(utki::shared_ref context, std::u32string title = std::u32string(U"SpO2 %")); + spo2_parameter_window(utki::shared_ref context, ruis::string title = std::u32string(U"SpO2 %")); ~spo2_parameter_window() override; spo2_parameter_window(const spo2_parameter_window&) = delete; diff --git a/src/bedsidemon/spo2/spo2_parameter_window_menu.cpp b/src/bedsidemon/spo2/spo2_parameter_window_menu.cpp index 8037a22..8fc7d96 100644 --- a/src/bedsidemon/spo2/spo2_parameter_window_menu.cpp +++ b/src/bedsidemon/spo2/spo2_parameter_window_menu.cpp @@ -96,7 +96,7 @@ std::vector> make_menu_contents(utki::shared_ref< .font_size = style::font_size_setting } }, - U"Color:"s + c.get().localization.get("waveform_color_setting_title") ), m::gap(c, { @@ -138,7 +138,7 @@ spo2_parameter_window_menu::spo2_parameter_window_menu( ), menu( this->context, // - U"SpO2"s, + this->context.get().localization.get("spo2_settings_menu_title"), make_menu_contents(this->context) ), spo2_pw(std::move(spo2_pw))