diff --git a/kml/serdes.cpp b/kml/serdes.cpp index 9022314d0d..d556c79429 100644 --- a/kml/serdes.cpp +++ b/kml/serdes.cpp @@ -384,7 +384,7 @@ void SaveBookmarkData(KmlWriter::WriterWrapper & writer, BookmarkData const & bo writer << kIndent2 << "\n"; writer << kIndent4 << ""; std::string const defaultLang = StringUtf8Multilang::GetLangByCode(kDefaultLangCode); - SaveStringWithCDATA(writer, GetPreferredBookmarkName(bookmarkData, defaultLang, defaultLang)); + SaveStringWithCDATA(writer, GetPreferredBookmarkName(bookmarkData, defaultLang)); writer << "\n"; if (!bookmarkData.m_description.empty()) @@ -862,7 +862,15 @@ void KmlParser::CharData(std::string value) { if (currTag == "name") { - // Use this name only if we have not read name from extended data yet. + // We always prefer extended data. There is the following logic of "name" data usage: + // 1. We have read extended data. + // 1.1. There is "default" language in extended data (m_name is not empty). + // The condition protects us from name rewriting. + // 1.2. There is no "default" language in extended data. Data from "name" are merged + // with extended data. It helps us in the case when we did not save "default" + // language in extended data. + // 2. We have NOT read extended data yet (or at all). In this case m_name must be empty. + // If extended data will be read, it can rewrite "default" language, since we prefer extended data. if (m_name.find(kDefaultLang) == m_name.end()) m_name[kDefaultLang] = value; } diff --git a/kml/type_utils.cpp b/kml/type_utils.cpp index 712679cb71..6b8103be79 100644 --- a/kml/type_utils.cpp +++ b/kml/type_utils.cpp @@ -5,6 +5,8 @@ #include "indexer/classificator.hpp" #include "indexer/feature_utils.hpp" +#include "platform/preferred_languages.hpp" + #include "coding/multilang_utf8_string.hpp" namespace kml @@ -70,9 +72,9 @@ std::string GetLocalizedBookmarkType(std::vector const & types, std::s return categories.GetReadableFeatureType(type, categories.MapLocaleToInteger(languageOrig)); } -std::string GetPreferredBookmarkName(BookmarkData const & bmData, std::string const & languageNorm, - std::string const & languageOrig) +std::string GetPreferredBookmarkName(BookmarkData const & bmData, std::string const & languageOrig) { + auto const languageNorm = languages::Normalize(languageOrig); std::string name = GetPreferredBookmarkStr(bmData.m_customName, languageNorm); if (name.empty()) name = GetPreferredBookmarkStr(bmData.m_name, languageNorm); diff --git a/kml/type_utils.hpp b/kml/type_utils.hpp index a78d1bcdb5..fef41ad847 100644 --- a/kml/type_utils.hpp +++ b/kml/type_utils.hpp @@ -78,8 +78,7 @@ inline void SetDefaultStr(LocalizableString & localizableStr, std::string const extern bool IsEqual(std::vector const & v1, std::vector const & v2); struct BookmarkData; -std::string GetPreferredBookmarkName(BookmarkData const & bmData, std::string const & languageNorm, - std::string const & languageOrig); +std::string GetPreferredBookmarkName(BookmarkData const & bmData, std::string const & languageOrig); std::string GetPreferredBookmarkStr(LocalizableString const & name, std::string const & languageNorm); std::string GetPreferredBookmarkStr(LocalizableString const & name, feature::RegionData const & regionData, std::string const & languageNorm); diff --git a/map/bookmark_helpers.cpp b/map/bookmark_helpers.cpp index 6d8f23ff40..d824876bf7 100644 --- a/map/bookmark_helpers.cpp +++ b/map/bookmark_helpers.cpp @@ -450,7 +450,7 @@ std::string GetLocalizedBookmarkType(std::vector const & types) std::string GetPreferredBookmarkName(kml::BookmarkData const & bmData) { - return kml::GetPreferredBookmarkName(bmData, languages::GetCurrentNorm(), languages::GetCurrentOrig()); + return kml::GetPreferredBookmarkName(bmData, languages::GetCurrentOrig()); } bool FromCatalog(kml::FileData const & kmlData)