From 4bfeb368aecdce7ed417f40ec5b8223b39483be8 Mon Sep 17 00:00:00 2001 From: Alex Duchesne Date: Sun, 10 Nov 2024 15:15:26 -0500 Subject: [PATCH] rg_localization: Got rid of the switch, made GUI dynamic --- LOCALIZATION.md | 25 ++++------------- components/retro-go/rg_gui.c | 23 ++++++++-------- components/retro-go/rg_localization.c | 39 ++++++++++++++------------- components/retro-go/rg_localization.h | 28 ++++++++++--------- components/retro-go/translations.h | 4 ++- 5 files changed, 56 insertions(+), 63 deletions(-) diff --git a/LOCALIZATION.md b/LOCALIZATION.md index 3a82c129e..b256f029f 100644 --- a/LOCALIZATION.md +++ b/LOCALIZATION.md @@ -15,10 +15,10 @@ If you want to add your own language : First, this is what the struct definition should looks like in rg_localization.h : ````c typedef struct { - char *msg; // Original message in english - char *fr; // FR Translated message + const char *msg; // Original message in english + const char *fr; // FR Translated message - char *es; // to add spanish translation + const char *es; // to add spanish translation } Translation; ```` @@ -31,26 +31,11 @@ enum languages RG_LANG_ES, // to add spanish translation - RG_LANGUAGE_MAX + RG_LANG_MAX }; ```` -Lastly, you have to update the switch statement in rg_localization.c : -````c -switch (rg_language) - { - case RG_LANG_FR: - return translations[i].fr; // Return the french string - break; - - - // to add spanish translation - case RG_LANG_ES: - return translations[i].es; // Return the spanish string - break; - } -```` # Python tool `rg_locate_str.py` is a simple python tool that locate every string preceded by `_("` pattern in each file of Retro-go project -Then the tool compare theses strings to the ones in `rg_localization.h` and put the missing ones in a .txt file called missing_translation.txt \ No newline at end of file +Then the tool compare theses strings to the ones in `translations.h` and put the missing ones in a .txt file called missing_translation.txt diff --git a/components/retro-go/rg_gui.c b/components/retro-go/rg_gui.c index d14bcf40a..95c85bdbd 100644 --- a/components/retro-go/rg_gui.c +++ b/components/retro-go/rg_gui.c @@ -101,10 +101,10 @@ void rg_gui_init(void) gui.screen_width = rg_display_get_info()->screen.width; gui.screen_height = rg_display_get_info()->screen.height; gui.draw_buffer = get_draw_buffer(gui.screen_width, 18, C_BLACK); + rg_gui_set_language_id(rg_settings_get_number(NS_GLOBAL, SETTING_LANGUAGE, RG_LANG_EN)); rg_gui_set_font(rg_settings_get_number(NS_GLOBAL, SETTING_FONTTYPE, RG_FONT_VERA_12)); rg_gui_set_theme(rg_settings_get_string(NS_GLOBAL, SETTING_THEME, NULL)); gui.show_clock = rg_settings_get_number(NS_GLOBAL, SETTING_CLOCK, 0); - rg_gui_set_language_id(rg_settings_get_number(NS_GLOBAL, SETTING_LANGUAGE, 0)); gui.initialized = true; } @@ -1352,18 +1352,17 @@ static rg_gui_event_t theme_cb(rg_gui_option_t *option, rg_gui_event_t event) static rg_gui_event_t language_cb(rg_gui_option_t *option, rg_gui_event_t event) { - const char *languages[] = {"English", "Francais"}; - int slot = rg_localization_get_language_id(); + int language_id = rg_localization_get_language_id(); + const char *language_name = rg_localization_get_language_name(language_id); if (event == RG_DIALOG_ENTER) { - // to do : make this dynamic - const rg_gui_option_t options[] = { - {0, _(languages[0]), NULL, RG_DIALOG_FLAG_NORMAL, NULL}, - {1, _(languages[1]), NULL, RG_DIALOG_FLAG_NORMAL, NULL}, - RG_DIALOG_END, - }; - int sel = rg_gui_dialog(_("Language"), options, slot); + rg_gui_option_t options[RG_LANG_MAX]; + for (int i = 0; i < RG_LANG_MAX; i++) + options[i] = (rg_gui_option_t){i, rg_localization_get_language_name(i), NULL, RG_DIALOG_FLAG_NORMAL, NULL}; + options[RG_LANG_MAX - 1] = (rg_gui_option_t)RG_DIALOG_END; + + int sel = rg_gui_dialog(_("Language"), options, language_id); if (sel != RG_DIALOG_CANCELLED) { rg_gui_set_language_id(sel); @@ -1371,10 +1370,12 @@ static rg_gui_event_t language_cb(rg_gui_option_t *option, rg_gui_event_t event) { rg_system_exit(); } + language_id = sel; + language_name = rg_localization_get_language_name(sel); } return RG_DIALOG_REDRAW; } - sprintf(option->value, "%s", languages[slot]); + sprintf(option->value, "%s", language_name ? language_name : "???"); return RG_DIALOG_VOID; } diff --git a/components/retro-go/rg_localization.c b/components/retro-go/rg_localization.c index 1ba50e80e..010630fc4 100644 --- a/components/retro-go/rg_localization.c +++ b/components/retro-go/rg_localization.c @@ -1,7 +1,7 @@ #include "rg_localization.h" #include "translations.h" -int rg_language = RG_LANG_EN; +static int rg_language = RG_LANG_EN; int rg_localization_get_language_id(void) { @@ -10,36 +10,37 @@ int rg_localization_get_language_id(void) bool rg_localization_set_language_id(int language_id) { - if (language_id < 0 || language_id > RG_LANGUAGE_MAX - 1) + if (language_id < 0 || language_id > RG_LANG_MAX - 1) return false; rg_language = language_id; return true; } -const char* rg_gettext(const char *text) +const char *rg_gettext(const char *text) { - if (rg_language == RG_LANG_EN) - return text; // in case language == 0 == english -> return the original string + if (text == NULL) + return NULL; + + if (rg_language <= 0 || rg_language >= RG_LANG_MAX) + return text; // If rg_language is english or invalid, we return the original string for (int i = 0; translations[i].msg != NULL; i++) { if (strcmp(translations[i].msg, text) == 0) { - switch (rg_language) - { - case RG_LANG_FR: - return translations[i].fr; // Return the french string - break; - - /* - case RG_LANG_ES: - return translations[i].es; // Return the spanish string - break; - */ - - } + const char *msg = translations[i].msgs[rg_language]; + // If the translation is missing, we return the original string + return msg ? msg : text; } } + return text; // if no translation found -} \ No newline at end of file +} + +const char *rg_localization_get_language_name(int language_id) +{ + if (language_id < 0 || language_id > RG_LANG_MAX - 1) + return NULL; + return language_names[language_id]; +} diff --git a/components/retro-go/rg_localization.h b/components/retro-go/rg_localization.h index ca3dbc131..699ccc5ff 100644 --- a/components/retro-go/rg_localization.h +++ b/components/retro-go/rg_localization.h @@ -5,24 +5,28 @@ #define _(String) rg_gettext(String) -// Define a struct for holding message translations -typedef struct -{ - char *msg; // Original message in english - char *fr; // FR Translated message -// char *de; // for adding DE translation for example -} Translation; - enum languages { - RG_LANG_EN, + RG_LANG_EN = 0, RG_LANG_FR, //RG_LANG_ES, - RG_LANGUAGE_MAX + RG_LANG_MAX }; +// Define a struct for holding message translations +typedef union +{ + struct { + const char *msg; // Original message in english + const char *fr; // FR Translated message + // const char *es; // for adding ES translation for example + }; + const char *msgs[RG_LANG_MAX]; +} Translation; + // Lookup function -const char* rg_gettext(const char *msg); +const char *rg_gettext(const char *msg); int rg_localization_get_language_id(void); -bool rg_localization_set_language_id(int language_id); \ No newline at end of file +bool rg_localization_set_language_id(int language_id); +const char *rg_localization_get_language_name(int language_id); diff --git a/components/retro-go/translations.h b/components/retro-go/translations.h index 530c5fc21..b81bff231 100644 --- a/components/retro-go/translations.h +++ b/components/retro-go/translations.h @@ -2,7 +2,9 @@ #include "rg_localization.h" -Translation translations[] = +static const char *language_names[RG_LANG_MAX] = {"English", "Francais"}; + +static const Translation translations[] = { { .msg = "Yes",