diff --git a/indexer/feature_utils.cpp b/indexer/feature_utils.cpp index 235811225a..4e249c83ec 100644 --- a/indexer/feature_utils.cpp +++ b/indexer/feature_utils.cpp @@ -286,4 +286,26 @@ void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & GetMwmLangName(regionData, src, out); } + +int8_t GetNameForSearchOnBooking(RegionData const & regionData, StringUtf8Multilang const & src, + string & name) +{ + if (src.GetString(StringUtf8Multilang::kDefaultCode, name)) + return StringUtf8Multilang::kDefaultCode; + + vector mwmLangs; + regionData.GetLanguages(mwmLangs); + + for (auto mwmLang : mwmLangs) + { + if (src.GetString(mwmLang, name)) + return mwmLang; + } + + if (src.GetString(StringUtf8Multilang::kEnglishCode, name)) + return StringUtf8Multilang::kEnglishCode; + + name.clear(); + return StringUtf8Multilang::kUnsupportedLanguageCode; +} } // namespace feature diff --git a/indexer/feature_utils.hpp b/indexer/feature_utils.hpp index 7f4f055147..7b91c797d9 100644 --- a/indexer/feature_utils.hpp +++ b/indexer/feature_utils.hpp @@ -46,4 +46,12 @@ namespace feature /// - country language name. void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src, int8_t const deviceLang, bool allowTranslit, string & out); + + /// Returns language id as return result and name for search on booking in the @name parameter, + /// the priority is the following: + /// - default name; + /// - country language name; + /// - english name. + int8_t GetNameForSearchOnBooking(RegionData const & regionData, StringUtf8Multilang const & src, + string & name); } // namespace feature diff --git a/indexer/indexer_tests/feature_names_test.cpp b/indexer/indexer_tests/feature_names_test.cpp index a5af27cddb..19b53f9a04 100644 --- a/indexer/indexer_tests/feature_names_test.cpp +++ b/indexer/indexer_tests/feature_names_test.cpp @@ -313,4 +313,71 @@ UNIT_TEST(GetReadableName) TEST_EQUAL(name, "ko name", ()); } } + +UNIT_TEST(GetNameForSearchOnBooking) +{ + { + StrUtf8 src; + feature::RegionData regionData; + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::kUnsupportedLanguageCode, ()); + TEST(result.empty(), ()); + } + { + StrUtf8 src; + src.AddString("default", "default name"); + feature::RegionData regionData; + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::kDefaultCode, ()); + TEST_EQUAL(result, "default name", ()); + } + { + StrUtf8 src; + src.AddString("default", "default name"); + src.AddString("ko", "ko name"); + src.AddString("en", "en name"); + feature::RegionData regionData; + regionData.SetLanguages({"ko", "en"}); + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::kDefaultCode, ()); + TEST_EQUAL(result, "default name", ()); + } + { + StrUtf8 src; + src.AddString("en", "en name"); + src.AddString("ko", "ko name"); + feature::RegionData regionData; + regionData.SetLanguages({"ko"}); + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::GetLangIndex("ko"), ()); + TEST_EQUAL(result, "ko name", ()); + } + { + StrUtf8 src; + src.AddString("en", "en name"); + src.AddString("ko", "ko name"); + src.AddString("de", "de name"); + feature::RegionData regionData; + regionData.SetLanguages({"de", "ko"}); + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::GetLangIndex("de"), ()); + TEST_EQUAL(result, "de name", ()); + } + { + StrUtf8 src; + src.AddString("en", "en name"); + src.AddString("ko", "ko name"); + feature::RegionData regionData; + regionData.SetLanguages({"de", "fr"}); + string result; + auto lang = feature::GetNameForSearchOnBooking(regionData, src, result); + TEST_EQUAL(lang, StrUtf8::GetLangIndex("en"), ()); + TEST_EQUAL(result, "en name", ()); + } +} } // namespace diff --git a/map/framework.cpp b/map/framework.cpp index 305da6df07..30159e840f 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -183,26 +183,13 @@ string MakeSearchBookingUrl(booking::Api const & bookingApi, CityFinder & cityFi FeatureType const & ft) { string name; - int8_t lang = StringUtf8Multilang::kUnsupportedLanguageCode; - auto const & info = ft.GetID().m_mwmId.GetInfo(); ASSERT(info, ()); - vector mwmLangs; - info->GetRegionData().GetLanguages(mwmLangs); - for (auto mwmLang : mwmLangs) - { - if (ft.GetName(mwmLang, name)) - { - lang = mwmLang; - break; - } - } - if (name.empty() && ft.GetName(StringUtf8Multilang::kEnglishCode, name)) - lang = StringUtf8Multilang::kEnglishCode; + int8_t lang = feature::GetNameForSearchOnBooking(info->GetRegionData(), ft.GetNames(), name); - if (name.empty() && ft.GetName(StringUtf8Multilang::kDefaultCode, name)) - lang = StringUtf8Multilang::kDefaultCode; + if (lang == StringUtf8Multilang::kUnsupportedLanguageCode) + return {}; string city = cityFinder.GetCityName(feature::GetCenter(ft), lang); @@ -950,6 +937,7 @@ void Framework::FillInfoFromFeatureType(FeatureType const & ft, place_page::Info else if (ftypes::IsHotelChecker::Instance()(ft)) { info.m_bookingSearchUrl = MakeSearchBookingUrl(*m_bookingApi, *m_cityFinder, ft); + LOG(LINFO, (info.m_bookingSearchUrl)); } auto const mwmInfo = ft.GetID().m_mwmId.GetInfo();