From 17c059b6f714ff0bf43ba1ddc6b7a480470e67d2 Mon Sep 17 00:00:00 2001 From: Muzychenko Andrey <33288308+k4zmu2a@users.noreply.github.com> Date: Mon, 29 Aug 2022 12:46:19 +0300 Subject: [PATCH] Simplified language list. --- SpaceCadetPinball/translations.cpp | 87 ++++++++++++++---------------- SpaceCadetPinball/translations.h | 48 ++--------------- SpaceCadetPinball/winmain.cpp | 12 ++--- 3 files changed, 48 insertions(+), 99 deletions(-) diff --git a/SpaceCadetPinball/translations.cpp b/SpaceCadetPinball/translations.cpp index 4b35ab3..bf448a4 100644 --- a/SpaceCadetPinball/translations.cpp +++ b/SpaceCadetPinball/translations.cpp @@ -4,32 +4,59 @@ lang translations::current_language = lang::English; - -const languageInfo* translations::get_languages(size_t* languages_number) { - if(languages_number) { - *languages_number = languages.size(); - } - return languages.data(); -} +const languageInfo translations::Languages[static_cast(lang::Max)] = +{ + { lang::Arabic, "ar", "Arabic" }, + { lang::Czech, "cs", "Czech" }, + { lang::Danish, "da", "Danish" }, + { lang::German, "de", "German" }, + { lang::Greek, "el", "Greek" }, + { lang::English, "en", "English" }, + { lang::Spanish, "es", "Spanish" }, + { lang::Finnish, "fi", "Finnish" }, + { lang::French, "fr", "French" }, + { lang::Hebrew, "he", "Hebrew" }, + { lang::Hungarian, "hu", "Hungarian" }, + { lang::Italian, "it", "Italian" }, + { lang::Japanese, "ja", "Japanese" }, + { lang::Korean, "ko", "Korean" }, + { lang::Norwegian, "nb", "Norwegian" }, + { lang::Dutch, "nl", "Dutch" }, + { lang::Polish, "pl", "Polish" }, + { lang::BrazilianPortuguese, "pt_BR", "Brazilian Portuguese" }, + { lang::Portuguese, "pt_PT", "Portuguese" }, + { lang::Russian, "ru", "Russian" }, + { lang::Swedish, "sv", "Swedish" }, + { lang::Turkish, "tr", "Turkish" }, + { lang::SimplifiedChinese, "zh_CN", "Simplified Chinese" }, + { lang::TraditionalChinese, "zh_TW", "Traditional Chinese" }, +}; void translations::set_current_language(const char* short_name) { - for(int i = 0; i < (int)lang::Max; i++) { - if(!strcmp(short_name, languages[(lang)i].short_name)) { - current_language = (lang) i; + for (const auto& langInfo : Languages) + { + if (!strcmp(short_name, langInfo.short_name)) + { + current_language = langInfo.Language; return; } } - printf("Unknown language \"%s\"\n", short_name); + + assertm(false, "Unknown language"); } const languageInfo* translations::get_current_language() { - if(!TextArray::contains(current_language)) + for (const auto& langInfo : Languages) { - current_language = lang::English; + if (langInfo.Language == current_language) + { + return &langInfo; + } } - return &languages[current_language]; + + return nullptr; } const char* translations::get_translation(Msg id) @@ -65,38 +92,6 @@ void translations::get_glyph_range(ImVector* ranges) builder.BuildRanges(ranges); } -const InitializedArray< - lang, - languageInfo, - (int)lang::Max - > translations::languages = -{ - { lang::Arabic, {"ar", "Arabic" } }, - { lang::Czech, {"cs", "Czech" } }, - { lang::Danish, {"da", "Danish" } }, - { lang::German, {"de", "German" } }, - { lang::Greek, {"el", "Greek" } }, - { lang::English, {"en", "English" } }, - { lang::Spanish, {"es", "Spanish" } }, - { lang::Finnish, {"fi", "Finnish" } }, - { lang::French, {"fr", "French" } }, - { lang::Hebrew, {"he", "Hebrew" } }, - { lang::Hungarian, {"hu", "Hungarian" } }, - { lang::Italian, {"it", "Italian" } }, - { lang::Japanese, {"ja", "Japanese" } }, - { lang::Korean, {"ko", "Korean" } }, - { lang::Norwegian, {"nb", "Norwegian" } }, - { lang::Dutch, {"nl", "Dutch" } }, - { lang::Polish, {"pl", "Polish" } }, - { lang::BrazilianPortuguese, {"pt_BR", "Brazilian Portuguese" } }, - { lang::Portuguese, {"pt_PT", "Portuguese" } }, - { lang::Russian, {"ru", "Russian" } }, - { lang::Swedish, {"sv", "Swedish" } }, - { lang::Turkish, {"tr", "Turkish" } }, - { lang::SimplifiedChinese, {"zh_CN", "Simplified Chinese" } }, - { lang::TraditionalChinese, {"zh_TW", "Traditional Chinese" } }, -}; - const TextArray translations::Translations = { { diff --git a/SpaceCadetPinball/translations.h b/SpaceCadetPinball/translations.h index 5b42629..7faf57b 100644 --- a/SpaceCadetPinball/translations.h +++ b/SpaceCadetPinball/translations.h @@ -288,45 +288,6 @@ enum class lang : int Max }; - -template -struct InitializedArray -{ - static_assert(std::is_enum::value, "Key is not an enum"); - - InitializedArray(const std::initializer_list>& iList) - { - for (const auto& pair : iList) - { - auto index = static_cast(pair.first); - Store[index] = pair.second; - } - } - - const Value& operator[](Key index) const - { - return Store[static_cast(index)]; - } - - const Value* data() const - { - return Store; - } - - static bool contains(Key index) - { - return N >= 0 && N > static_cast(index); - } - - static size_t size() - { - return N; - } - -private: - Value Store[N]{}; -}; - struct TextArray { TextArray(const std::initializer_list>>>& iList) @@ -376,6 +337,7 @@ private: struct languageInfo { + const lang Language; const char* short_name; const char* display_name; }; @@ -383,7 +345,8 @@ struct languageInfo class translations { public: - static const languageInfo* get_languages(size_t* languages_number); + static const languageInfo Languages[static_cast(lang::Max)]; + static const char* get_translation(Msg id); static void set_current_language(const char* short_name); static const languageInfo* get_current_language(); @@ -391,10 +354,5 @@ public: private: static const TextArray Translations; - static const InitializedArray< - lang, - languageInfo, - static_cast(lang::Max) - > languages; static lang current_language; }; diff --git a/SpaceCadetPinball/winmain.cpp b/SpaceCadetPinball/winmain.cpp index 5759d46..63d2d05 100644 --- a/SpaceCadetPinball/winmain.cpp +++ b/SpaceCadetPinball/winmain.cpp @@ -469,16 +469,12 @@ void winmain::RenderUi() } if (ImGui::BeginMenu("Language")) { - std::string current_language = translations::get_current_language()->short_name; - size_t language_number; - const languageInfo* languages = translations::get_languages(&language_number); - - for(size_t i = 0; i < language_number; i++) + auto currentLanguage = translations::get_current_language(); + for (auto &item : translations::Languages) { - const languageInfo* item = &languages[i]; - if (ImGui::MenuItem(item->display_name, nullptr, current_language == item->short_name)) + if (ImGui::MenuItem(item.display_name, nullptr, currentLanguage->Language == item.Language)) { - translations::set_current_language(item->short_name); + translations::set_current_language(item.short_name); winmain::Restart(); } }