diff --git a/indexer/feature_utils.cpp b/indexer/feature_utils.cpp index f4aababbb..bf9495f0b 100644 --- a/indexer/feature_utils.cpp +++ b/indexer/feature_utils.cpp @@ -128,34 +128,50 @@ bool IsNativeLang(feature::RegionData const & regionData, int8_t deviceLang) return false; } -vector MakeLanguagesPriorityList(int8_t deviceLang, bool preferDefault) +int8_t DefaultLanguage(feature::RegionData const & regionData, vector langs) { - vector langPriority = {deviceLang}; - for (auto const & lang : languages::GetPreferredLangIndexes()) + for (auto const lang : langs) { - if (find(langPriority.begin(), langPriority.end(), lang) == langPriority.end()) + if (regionData.HasLanguage(lang)) + return lang; + + for (auto const similiarLang : GetSimilarLanguages(lang)) { - langPriority.push_back(lang); + if (regionData.HasLanguage(similiarLang)) + return similiarLang; } } - - if (preferDefault) - langPriority.push_back(StrUtf8::kDefaultCode); - /// @DebugNote - // Add ru lang for descriptions/rendering tests. - //langPriority.push_back(StrUtf8::GetLangIndex("ru")); + return StrUtf8::kDefaultCode; +} - auto const similarLangs = GetSimilarLanguages(deviceLang); - langPriority.insert(langPriority.cend(), similarLangs.cbegin(), similarLangs.cend()); - langPriority.insert(langPriority.cend(), {StrUtf8::kInternationalCode, StrUtf8::kEnglishCode}); +vector PrioritizedLanguages(vector const & langs, int8_t defaultLang) +{ + vector prioritizedLangs = {}; - return langPriority; + for (auto const lang : langs) + { + if (find(prioritizedLangs.begin(), prioritizedLangs.end(), lang) == prioritizedLangs.end()) + prioritizedLangs.push_back(lang); + + if (defaultLang != StrUtf8::kUnsupportedLanguageCode && defaultLang == lang) + prioritizedLangs.push_back(StrUtf8::kDefaultCode); + + auto const similarLangs = GetSimilarLanguages(lang); + prioritizedLangs.insert(prioritizedLangs.cend(), similarLangs.cbegin(), similarLangs.cend()); + } + + prioritizedLangs.push_back(StrUtf8::kInternationalCode); + prioritizedLangs.push_back(StrUtf8::kEnglishCode); + prioritizedLangs.push_back(StrUtf8::kDefaultCode); + + return prioritizedLangs; } void GetReadableNameImpl(NameParamsIn const & in, bool preferDefault, NameParamsOut & out) { - auto const langPriority = MakeLanguagesPriorityList(in.deviceLang, preferDefault); + auto const preferredLangs = languages::GetPreferredLangIndexes(); + auto const langPriority = PrioritizedLanguages(preferredLangs, DefaultLanguage(in.regionData, preferredLangs)); if (GetBestName(in.src, langPriority, out.primary)) return; @@ -361,7 +377,8 @@ void GetPreferredNames(NameParamsIn const & in, NameParamsOut & out) if (in.IsNativeOrSimilarLang()) return GetReadableNameImpl(in, true /* preferDefault */, out); - auto const primaryCodes = MakeLanguagesPriorityList(in.deviceLang, false /* preferDefault */); + auto const preferredLangs = languages::GetPreferredLangIndexes(); + auto const primaryCodes = PrioritizedLanguages(preferredLangs, DefaultLanguage(in.regionData, preferredLangs)); if (!GetBestName(in.src, primaryCodes, out.primary) && in.allowTranslit) GetTransliteratedName(in.regionData, in.src, out.transliterated); @@ -426,14 +443,15 @@ int8_t GetNameForSearchOnBooking(RegionData const & regionData, StringUtf8Multil bool GetPreferredName(StringUtf8Multilang const & src, int8_t deviceLang, string_view & out) { - auto const priorityList = MakeLanguagesPriorityList(deviceLang, true /* preferDefault */); + auto const preferredLangs = languages::GetPreferredLangIndexes(); + auto const priorityList = PrioritizedLanguages(preferredLangs, StrUtf8::kUnsupportedLanguageCode); return GetBestName(src, priorityList, out); } -vector GetDescriptionLangPriority(RegionData const & regionData, int8_t const deviceLang) +vector GetDescriptionLangPriority(RegionData const & regionData) { - bool const preferDefault = IsNativeLang(regionData, deviceLang); - return MakeLanguagesPriorityList(deviceLang, preferDefault); + auto const preferredLangs = languages::GetPreferredLangIndexes(); + return PrioritizedLanguages(preferredLangs, DefaultLanguage(regionData, preferredLangs)); } vector GetCuisines(TypesHolder const & types) diff --git a/indexer/feature_utils.hpp b/indexer/feature_utils.hpp index 024d116ce..fc0795170 100644 --- a/indexer/feature_utils.hpp +++ b/indexer/feature_utils.hpp @@ -136,12 +136,13 @@ namespace feature /// Returns priority list of language codes for feature description, /// the priority is the following: - /// - device language code; - /// - default language code if MWM contains user's language (or similar to device languages if provided); - /// - languages that we know are similar to device language; + /// - device language codes in order of preference; + /// - including default language code, if MWM contains the language (or similar to device language if provided); + /// - including languages that we know are similar to device language; /// - international language code; /// - english language code; - std::vector GetDescriptionLangPriority(RegionData const & regionData, int8_t const deviceLang); + /// - default language code; + std::vector GetDescriptionLangPriority(RegionData const & regionData); // Returns vector of cuisines readable names from classificator. std::vector GetCuisines(TypesHolder const & types); diff --git a/map/framework.cpp b/map/framework.cpp index 488a31433..22282df66 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -3339,8 +3339,7 @@ void Framework::FillDescription(FeatureType & ft, place_page::Info & info) const if (!ft.GetID().m_mwmId.IsAlive()) return; auto const & regionData = ft.GetID().m_mwmId.GetInfo()->GetRegionData(); - auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentMapLanguage()); - auto const langPriority = feature::GetDescriptionLangPriority(regionData, deviceLang); + auto const langPriority = feature::GetDescriptionLangPriority(regionData); std::string wikiDescription = m_descriptionsLoader->GetWikiDescription(ft.GetID(), langPriority); if (!wikiDescription.empty()) diff --git a/platform/preferred_languages.cpp b/platform/preferred_languages.cpp index 61ff101d0..b4fe417f0 100644 --- a/platform/preferred_languages.cpp +++ b/platform/preferred_languages.cpp @@ -191,6 +191,11 @@ std::string GetCurrentMapLanguage() std::vector GetPreferredLangIndexes() { std::vector langs = {}; + + auto const mapLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentMapLanguage()); + if (mapLang != StringUtf8Multilang::kUnsupportedLanguageCode) + langs.push_back(mapLang); + for (auto const & systemLanguage : GetSystemPreferred()) { auto normalizedLang = Normalize(systemLanguage);