From dc828b01b83f4e9072d8bdf1895d8ff79643d940 Mon Sep 17 00:00:00 2001 From: Alexis Murzeau Date: Sat, 27 Aug 2022 22:15:57 +0200 Subject: [PATCH] translations: handle non existing translations gracefuly (don't crash) Fallback to english if available, else return empty string --- SpaceCadetPinball/translations.cpp | 37 +++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/SpaceCadetPinball/translations.cpp b/SpaceCadetPinball/translations.cpp index 66a4ba5..2384fff 100644 --- a/SpaceCadetPinball/translations.cpp +++ b/SpaceCadetPinball/translations.cpp @@ -22,6 +22,11 @@ struct InitializedArray } } + bool contains(Key index) const + { + return Store.size() > static_cast(index); + } + const Value& operator[](Key index) const { return Store[static_cast(index)]; @@ -95,7 +100,7 @@ const languageInfo* translations::get_languages(size_t* languages_number) { void translations::set_current_language(const char* short_name) { for(int i = 0; i < languages.size(); i++) { - if(!strcmp(short_name, languages[i].short_name)) { + if(!strcmp(short_name, languages[static_cast(i)].short_name)) { current_language = (lang) i; return; } @@ -105,12 +110,38 @@ void translations::set_current_language(const char* short_name) const languageInfo* translations::get_current_language() { - return ¤t_language[current_language]; + if(!languages.contains(current_language)) + { + current_language = lang::English; + } + return &languages[current_language]; } const char* translations::get_translation(Msg id) { - return translated_strings[id][current_language]; + if(!translated_strings.contains(id)) + { + return ""; + } + + const auto& translation = translated_strings[id]; + + if(!translation.contains(current_language)) + { + // fallback to english if available + if(translation.contains(lang::English)) + { + return translation[lang::English]; + } + else + { + return ""; + } + } + else + { + return translation[current_language]; + } } void translations::get_glyph_range(ImVector* ranges)