void FeatureType::SetNames(StringUtf8Multilang const & newNames) { m_params.name.Clear(); // Validate passed string to clean up empty names (if any). newNames.ForEach([this](int8_t langCode, string const & name) -> bool { if (!name.empty()) m_params.name.AddString(langCode, name); return true; }); if (m_params.name.IsEmpty()) SetHeader(~feature::HEADER_HAS_NAME & Header()); else SetHeader(feature::HEADER_HAS_NAME | Header()); }
// static NamesDataSource EditableMapObject::GetNamesDataSource(StringUtf8Multilang const & source, vector<int8_t> const & mwmLanguages, int8_t const userLangCode) { NamesDataSource result; auto & names = result.names; auto & mandatoryCount = result.mandatoryNamesCount; // Push Mwm languages. mandatoryCount = PushMwmLanguages(source, mwmLanguages, names); // Push english name. if (ExtractName(source, StringUtf8Multilang::kEnglishCode, names)) ++mandatoryCount; // Push user's language. if (ExtractName(source, userLangCode, names)) ++mandatoryCount; // Push other languages. source.ForEach([&names, mandatoryCount](int8_t const code, string const & name) { // Exclude default name. if (StringUtf8Multilang::kDefaultCode == code) return; auto const mandatoryNamesEnd = names.begin() + mandatoryCount; // Exclude languages which are already in container (languages with top priority). auto const it = find_if( names.begin(), mandatoryNamesEnd, [code](LocalizedName const & localizedName) { return localizedName.m_code == code; }); if (mandatoryNamesEnd == it) names.emplace_back(code, name); }); return result; }