From 1b4776e2365764c47c485575f16650f1e41d4558 Mon Sep 17 00:00:00 2001 From: "Eduardo P. Gomez" Date: Sun, 8 Oct 2023 01:51:42 -0300 Subject: [PATCH] Complete translation initialization --- .vscode/settings.json | 4 +- libs/opendx/opendx.cpp | 6 +- tests/basic_window.cpp | 2 +- tools/dxdiag/layout/MainWindow.ui | 34 +++---- tools/dxdiag/locale/en_US.hpp | 2 +- tools/dxdiag/locale/es_ES.hpp | 5 +- tools/dxdiag/locale/pt_BR.hpp | 15 ++++ tools/dxdiag/main.cpp | 8 +- tools/dxdiag/src/SystemTab.hpp | 141 ++++++++++++++++++++---------- 9 files changed, 145 insertions(+), 72 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9de80d9f..23073df0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -55,6 +55,8 @@ "streambuf": "cpp", "cinttypes": "cpp", "typeinfo": "cpp", - "*.ui": "cpp" + "*.ui": "cpp", + "bitset": "cpp", + "regex": "cpp" } } \ No newline at end of file diff --git a/libs/opendx/opendx.cpp b/libs/opendx/opendx.cpp index 64b9df24..9db1d613 100644 --- a/libs/opendx/opendx.cpp +++ b/libs/opendx/opendx.cpp @@ -48,6 +48,9 @@ HWND CreateWindowExA( gtk_widget_show(GTK_WIDGET(window)); } + // TODO: find a no-signal way + // g_signal_connect(window, "destroy", G_CALLBACK(on_window_destroy), NULL); + return window; } @@ -78,8 +81,7 @@ BOOL GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) BOOL PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { BOOL r = g_main_context_pending(NULL); - - //i know this is wrong, but i need to get the sample working + if (r) { g_main_context_iteration(NULL, true); } else { diff --git a/tests/basic_window.cpp b/tests/basic_window.cpp index 991212ea..0cc5b0bc 100644 --- a/tests/basic_window.cpp +++ b/tests/basic_window.cpp @@ -34,7 +34,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine MSG msg; //ZeroMemory(&msg, sizeof(msg)); while (msg.message != WM_QUIT) { - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { //TranslateMessage(&msg); //DispatchMessage(&msg); } else { diff --git a/tools/dxdiag/layout/MainWindow.ui b/tools/dxdiag/layout/MainWindow.ui index ed7c041f..fb971120 100644 --- a/tools/dxdiag/layout/MainWindow.ui +++ b/tools/dxdiag/layout/MainWindow.ui @@ -1,4 +1,4 @@ -R"XXX( +R"XML( @@ -20,7 +20,7 @@ R"XXX( 5 vertical - + This tool reports detailed information about the DirectX components and drivers installed on your system. @@ -49,7 +49,7 @@ If you know what area is causing the problem, click on the apropriate tab above. 5 1 - + end Current Date/Time: right @@ -72,7 +72,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Computer Name: right @@ -95,7 +95,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Operating System: right @@ -118,7 +118,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Language: right @@ -141,7 +141,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end System Manufacturer: right @@ -164,7 +164,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end System Model: right @@ -187,7 +187,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end BIOS: right @@ -210,7 +210,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Processor: right @@ -233,7 +233,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Memory: right @@ -256,7 +256,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end Page/Swap File: right @@ -279,7 +279,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end DirectX Version: right @@ -302,7 +302,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + end OpenDX Version: right @@ -332,7 +332,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + System Information @@ -341,7 +341,7 @@ If you know what area is causing the problem, click on the apropriate tab above. - + System @@ -398,4 +398,4 @@ If you know what area is causing the problem, click on the apropriate tab above. -)XXX" \ No newline at end of file +)XML" \ No newline at end of file diff --git a/tools/dxdiag/locale/en_US.hpp b/tools/dxdiag/locale/en_US.hpp index 7d758d73..59a30d86 100644 --- a/tools/dxdiag/locale/en_US.hpp +++ b/tools/dxdiag/locale/en_US.hpp @@ -2,7 +2,7 @@ #include /** - * TODO Complete with @see /include/types/Translation.hpp + * TODO Complete with project://include/types/Translation.hpp */ Translation_t Translation_enUS() { Translation_t r; diff --git a/tools/dxdiag/locale/es_ES.hpp b/tools/dxdiag/locale/es_ES.hpp index 0def8fc2..534e975a 100644 --- a/tools/dxdiag/locale/es_ES.hpp +++ b/tools/dxdiag/locale/es_ES.hpp @@ -1,11 +1,12 @@ #pragma once #include +#include "en_US.hpp" /** - * TODO Complete with @see /include/types/Translation.hpp + * TODO Complete with @see project://include/types/Translation.hpp */ Translation_t Translation_esES() { - Translation_t r; + Translation_t r = Translation_enUS(); //Common texts r.yes = (char*) "Sí"; diff --git a/tools/dxdiag/locale/pt_BR.hpp b/tools/dxdiag/locale/pt_BR.hpp index da461faa..6c33c3ca 100644 --- a/tools/dxdiag/locale/pt_BR.hpp +++ b/tools/dxdiag/locale/pt_BR.hpp @@ -10,6 +10,21 @@ Translation_t Translation_ptBR() { //Common texts r.yes = (char*) "Sim"; + r.no = (char*) "Não"; + r.not_available = (char*) "Indisponível"; + r.enabled = (char*) "Habilitado"; + + //Tab names + r.tab_system = (char*) "Sistema"; + r.tab_display = (char*) "Exibição"; + r.tab_sound = (char*) "Som"; + r.tab_input = (char*) "Entrada"; + + //Buttons + r.btn_help = (char*) "Ajuda"; + r.btn_next = (char*) "Próximo"; + r.btn_save = (char*) "Salvar"; + r.btn_exit = (char*) "Sair"; return r; } diff --git a/tools/dxdiag/main.cpp b/tools/dxdiag/main.cpp index 996b0ee5..88037bf6 100644 --- a/tools/dxdiag/main.cpp +++ b/tools/dxdiag/main.cpp @@ -1,8 +1,8 @@ -#pragma once +#include + +#include //GTK4 #include -#include -#include //GTK4 #include "layout/MainWindow.hpp" #include "src/SystemTab.hpp" @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window")); //setup events and show the screen: - SystemTab::setup(builder); + new SystemTab(builder); gtk_widget_show(GTK_WIDGET(window)); while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0) diff --git a/tools/dxdiag/src/SystemTab.hpp b/tools/dxdiag/src/SystemTab.hpp index 13bb64eb..390b1c38 100644 --- a/tools/dxdiag/src/SystemTab.hpp +++ b/tools/dxdiag/src/SystemTab.hpp @@ -1,23 +1,31 @@ #pragma once -#include #include #include +#include #include #include #include #include #include +#include #include #include #include -namespace SystemTab { +#include + +#include +#include "../locale/en_US.hpp" +#include "../locale/pt_BR.hpp" +#include "../locale/es_ES.hpp" + +class SystemTab { /** * Set the text from "date_val"to the actual date/time. */ - gboolean updateTime(GtkLabel* label) { + public:static gboolean updateTime(GtkLabel* label) { time_t t = time(NULL); - struct tm *time = localtime(&t); + struct tm* time = localtime(&t); gchar str_time[40]; strftime(str_time, sizeof(str_time), "%A, %b %d, %Y, %I:%M:%S %p", time); @@ -33,7 +41,7 @@ namespace SystemTab { /** * set a timeout event every 500ms to set the actual date/time */ - gboolean onRealizeTime(GtkLabel* label) { + public:static gboolean onRealizeTime(GtkLabel* label) { std::cout << "SystemTab::onRealizeTime()\n"; g_timeout_add (500, (GSourceFunc) SystemTab::updateTime, label); @@ -43,7 +51,7 @@ namespace SystemTab { /** * Set the text from "pc_val" to the unix hostname. */ - gboolean setHostname(GtkLabel* label) { + public:static gboolean setHostname(GtkLabel* label) { char hostname[1024]; gethostname(hostname, sizeof hostname); @@ -57,7 +65,7 @@ namespace SystemTab { return FALSE; } - std::string exec(const char* cmd) { + public:static std::string exec(const char* cmd) { std::vector buffer(1024); std::string result; FILE* pipe = popen(cmd, "r"); @@ -72,7 +80,7 @@ namespace SystemTab { return result; } - gboolean setOperatingSystem(GtkLabel* label) { + public:static gboolean setOperatingSystem(GtkLabel* label) { std::string distro = exec("lsb_release -i | awk '{print $3}'"); std::string distro_version = exec("lsb_release -r | awk '{print $2}'"); std::string kernel_version = exec("uname -r"); @@ -85,7 +93,8 @@ namespace SystemTab { //arch.erase(std::remove(arch.begin(), arch.end(), '\n'), arch.end()); std::string os_info = distro + " " + arch + " (" + distro_version + ", kernel " + kernel_version + ")"; - + os_info = std::regex_replace(os_info, std::regex("\n"), ""); + // Convert the string to const gchar* const gchar* text = os_info.c_str(); @@ -97,25 +106,16 @@ namespace SystemTab { return FALSE; } - gboolean setLanguage(GtkLabel* label) { + public:static gboolean setLanguage(GtkLabel* label) { char buffer[128]; + std::string locale = setlocale(LC_CTYPE, NULL); std::string lang, region; - // Get the LC_MESSAGES locale - std::FILE* fp = popen("locale | grep LC_MESSAGES | cut -d= -f2 | cut -d_ -f1", "r"); - std::fgets(buffer, 128, fp); - lang = buffer; - pclose(fp); - - // Get the LC_CTYPE locale - fp = popen("locale | grep LC_CTYPE | cut -d= -f2 | cut -d_ -f2", "r"); - std::fgets(buffer, 128, fp); - region = buffer; - pclose(fp); - - // Remove newline characters - lang.erase(lang.size() - 1, 1); + // get the language and region from the locale + lang = locale.substr(0, locale.find("_")); + region = locale.substr(locale.find("_") + 1); region.erase(region.size() - 1, 1); + region = region.substr(0, region.find(".")); // Return the formatted string std::string str = lang + " (Regional Setting: " + region + ")"; @@ -129,7 +129,7 @@ namespace SystemTab { return FALSE; } - gboolean setManufacturer(GtkLabel* label) { + public:static gboolean setManufacturer(GtkLabel* label) { std::ifstream file("/sys/class/dmi/id/sys_vendor"); std::string manufacturer; @@ -147,7 +147,7 @@ namespace SystemTab { return FALSE; } - gboolean setModel(GtkLabel* label) { + public:static gboolean setModel(GtkLabel* label) { std::ifstream file("/sys/class/dmi/id/product_name"); std::string model; @@ -165,7 +165,7 @@ namespace SystemTab { return FALSE; } - gboolean setBIOS(GtkLabel* label) { + public:static gboolean setBIOS(GtkLabel* label) { std::ifstream file("/sys/class/dmi/id/bios_version"); std::string bios; @@ -183,7 +183,7 @@ namespace SystemTab { return FALSE; } - std::string getCpuModelName() { + public:static std::string getCpuModelName() { std::ifstream file("/proc/cpuinfo"); std::string line; @@ -196,7 +196,7 @@ namespace SystemTab { return "Unknown"; } - int getCpuCoreCount() { + public:static int getCpuCoreCount() { std::ifstream file("/proc/cpuinfo"); std::string line; int core_count = 0; @@ -210,7 +210,7 @@ namespace SystemTab { return core_count; } - double getCpuFrequency() { + public:static double getCpuFrequency() { std::ifstream file("/proc/cpuinfo"); std::string line; double frequency = 0.0; @@ -224,10 +224,10 @@ namespace SystemTab { return frequency; } - std::string getCpuInfo() { - int core_count = getCpuCoreCount(); - double frequency = getCpuFrequency() / 1000; - std::string model_name = getCpuModelName(); + public:static std::string getCpuInfo() { + int core_count = SystemTab::getCpuCoreCount(); + double frequency = SystemTab::getCpuFrequency() / 1000; + std::string model_name = SystemTab::getCpuModelName(); std::ostringstream frequency_stream; frequency_stream << std::fixed << std::setprecision(2) << frequency / core_count; @@ -236,19 +236,18 @@ namespace SystemTab { return model_name + " (" + std::to_string(core_count) + " CPUs), ~" + formatted_frequency + "GHz"; } - gboolean setCPU(GtkLabel* label) { + public:static gboolean setCPU(GtkLabel* label) { std::string cpu = SystemTab::getCpuInfo(); const gchar* text = cpu.c_str(); gtk_label_set_text(label, text); gtk_widget_queue_draw(GTK_WIDGET(label)); gtk_widget_queue_draw(gtk_widget_get_parent(GTK_WIDGET(label))); - gtk_widget_show(GTK_WIDGET(label)); - + // gtk_widget_show(GTK_WIDGET(label)); return FALSE; } - gboolean setRAM(GtkLabel* label) { + public:static gboolean setRAM(GtkLabel* label) { std::ifstream file("/proc/meminfo"); std::string line; std::string ram = "0MB RAM"; @@ -270,8 +269,7 @@ namespace SystemTab { return FALSE; } - gboolean updateSwap(GtkLabel* label) { - + public:static gboolean updateSwap(GtkLabel* label) { struct sysinfo info; sysinfo(&info); @@ -287,17 +285,72 @@ namespace SystemTab { gtk_widget_show(GTK_WIDGET(label)); } - gboolean setSwap(GtkLabel* label) { - g_timeout_add (500, (GSourceFunc) SystemTab::updateSwap, label); + public:static gboolean setSwap(GtkLabel* label) { + g_timeout_add(500, (GSourceFunc) SystemTab::updateSwap, label); return FALSE; } /** * setup IDs and it's events */ - void setup(GtkBuilder* builder) { + public:SystemTab(GtkBuilder* builder) { std::cout << "SystemTab::setup()\n"; + this->setupLang(builder); + this->setupSignals(builder); + } + + private:void setupLang(GtkBuilder* builder) { + //get system locale + const char* locale = setlocale(LC_CTYPE, NULL); + Translation_t lang; + + //instantiate Translation_{locale}() from tools/dxdiag/locale/{locale}.hpp + if ( + strcmp(locale, "pt_BR.UTF-8") == 0 || + strcmp(locale, "pt_PT.UTF-8") == 0 + ) { + lang = Translation_ptBR(); // >:) + } else if (strcmp(locale, "es_ES.UTF-8")) { + lang = Translation_esES(); + } else { + lang = Translation_enUS(); + } + + //set texts + GtkLabel* tab_system = GTK_LABEL(gtk_builder_get_object(builder, "tab_system_txt")); + gtk_label_set_text(tab_system, lang.tab_system); + GtkLabel* system_description = GTK_LABEL(gtk_builder_get_object(builder, "system_description")); + gtk_label_set_text(system_description, lang.system_description); + GtkLabel* system_info_label = GTK_LABEL(gtk_builder_get_object(builder, "system_info_label")); + gtk_label_set_text(system_info_label, lang.system_info_label); + GtkLabel* system_info_currentDate = GTK_LABEL(gtk_builder_get_object(builder, "system_info_currentDate")); + gtk_label_set_text(system_info_currentDate, lang.system_info_currentDate); + GtkLabel* system_info_pcName = GTK_LABEL(gtk_builder_get_object(builder, "system_info_pcName")); + gtk_label_set_text(system_info_pcName, lang.system_info_pcName); + GtkLabel* system_info_os = GTK_LABEL(gtk_builder_get_object(builder, "system_info_os")); + gtk_label_set_text(system_info_os, lang.system_info_os); + GtkLabel* system_info_language = GTK_LABEL(gtk_builder_get_object(builder, "system_info_language")); + gtk_label_set_text(system_info_language, lang.system_info_language); + GtkLabel* system_info_manufacturer = GTK_LABEL(gtk_builder_get_object(builder, "system_info_manufacturer")); + gtk_label_set_text(system_info_manufacturer, lang.system_info_manufacturer); + GtkLabel* system_info_model = GTK_LABEL(gtk_builder_get_object(builder, "system_info_model")); + gtk_label_set_text(system_info_model, lang.system_info_model); + GtkLabel* system_info_bios = GTK_LABEL(gtk_builder_get_object(builder, "system_info_bios")); + gtk_label_set_text(system_info_bios, lang.system_info_bios); + GtkLabel* system_info_processor = GTK_LABEL(gtk_builder_get_object(builder, "system_info_processor")); + gtk_label_set_text(system_info_processor, lang.system_info_processor); + GtkLabel* system_info_memory = GTK_LABEL(gtk_builder_get_object(builder, "system_info_memory")); + gtk_label_set_text(system_info_memory, lang.system_info_memory); + GtkLabel* system_info_pageFile = GTK_LABEL(gtk_builder_get_object(builder, "system_info_pageFile")); + gtk_label_set_text(system_info_pageFile, lang.system_info_pageFile); + GtkLabel* system_info_directxVersion = GTK_LABEL(gtk_builder_get_object(builder, "system_info_directxVersion")); + gtk_label_set_text(system_info_directxVersion, lang.system_info_directxVersion); + GtkLabel* system_info_opendxVersion = GTK_LABEL(gtk_builder_get_object(builder, "system_info_opendxVersion")); + gtk_label_set_text(system_info_opendxVersion, lang.system_info_opendxVersion); + } + + private:void setupSignals(GtkBuilder* builder) { GtkLabel* date_val = GTK_LABEL(gtk_builder_get_object(builder, "date_val")); g_signal_connect (date_val, "realize", G_CALLBACK (SystemTab::onRealizeTime), NULL); GtkLabel* pc_val = GTK_LABEL(gtk_builder_get_object(builder, "pc_val")); @@ -319,4 +372,4 @@ namespace SystemTab { GtkLabel* swap_val = GTK_LABEL(gtk_builder_get_object(builder, "swap_val")); g_signal_connect (swap_val, "realize", G_CALLBACK (SystemTab::setSwap), NULL); } -} +};