From a1e53b2e50f0c484880ad22e53c11e45092640a7 Mon Sep 17 00:00:00 2001 From: LaGrunge Date: Thu, 27 Jun 2019 16:54:28 +0300 Subject: [PATCH] [generator] move translations to separate file --- generator/CMakeLists.txt | 2 ++ generator/regions/region_base.cpp | 47 +++--------------------------- generator/regions/region_base.hpp | 4 +-- generator/translation.cpp | 48 +++++++++++++++++++++++++++++++ generator/translation.hpp | 19 ++++++++++++ 5 files changed, 74 insertions(+), 46 deletions(-) create mode 100644 generator/translation.cpp create mode 100644 generator/translation.hpp diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index 115d6245fb..4f036a0db7 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -212,6 +212,8 @@ set( tesselator.hpp towns_dumper.cpp towns_dumper.hpp + translation.hpp + translation.cpp traffic_generator.cpp traffic_generator.hpp transit_generator.cpp diff --git a/generator/regions/region_base.cpp b/generator/regions/region_base.cpp index e55e83e771..720a28f2a4 100644 --- a/generator/regions/region_base.cpp +++ b/generator/regions/region_base.cpp @@ -1,59 +1,20 @@ #include "generator/regions/region_base.hpp" -#include "coding/transliteration.hpp" - #include "base/assert.hpp" #include "base/control_flow.hpp" -#include "base/string_utils.hpp" namespace generator { namespace regions { -namespace +std::string RegionWithName::GetName(LanguageCode languageCode) const { -// Languages in order for better transliterations. This is kind -// of workaround before real made translations. -const std::unordered_map - kPreferredLanguagesForTransliterate = { - {StringUtf8Multilang::GetLangIndex("ru"), {"en" /*English*/, "ru" /*Русский*/}}, - {StringUtf8Multilang::GetLangIndex("en"), {"en" /*English*/, "ru" /*Русский*/}}}; - -} // namespace - -std::string RegionWithName::GetName(int8_t lang) const -{ - std::string s; - VERIFY(m_name.GetString(lang, s) != s.empty(), ()); - return s; + return ::generator::GetName(m_name, languageCode); } -std::string RegionWithName::GetTranslatedOrTransliteratedName( - RegionWithName::LanguageCode languageCode) const +std::string RegionWithName::GetTranslatedOrTransliteratedName(LanguageCode languageCode) const { - std::string s = GetName(languageCode); - if (!s.empty() && strings::IsASCIIString(s)) - return s; - - s = GetName(StringUtf8Multilang::kInternationalCode); - if (!s.empty() && strings::IsASCIIString(s)) - return s; - - auto const fn = [&s](int8_t code, std::string const & name) { - if (code != StringUtf8Multilang::kDefaultCode && - Transliteration::Instance().Transliterate(name, code, s) && strings::IsASCIIString(s)) - { - return base::ControlFlow::Break; - } - - return base::ControlFlow::Continue; - }; - - if (kPreferredLanguagesForTransliterate.count(languageCode) && - !m_name.ForEachLanguage(kPreferredLanguagesForTransliterate.at(languageCode), fn)) - m_name.ForEach(fn); - - return s; + return ::generator::GetTranslatedOrTransliteratedName(m_name, languageCode); } StringUtf8Multilang const & RegionWithName::GetMultilangName() const { return m_name; } diff --git a/generator/regions/region_base.hpp b/generator/regions/region_base.hpp index 279e9db6c1..2c27cecef2 100644 --- a/generator/regions/region_base.hpp +++ b/generator/regions/region_base.hpp @@ -2,6 +2,7 @@ #include "generator/feature_builder.hpp" #include "generator/regions/region_info.hpp" +#include "generator/translation.hpp" #include "geometry/rect2d.hpp" @@ -27,9 +28,6 @@ using BoostRect = boost::geometry::model::box; class RegionWithName { public: - using LanguageCode = int8_t; - using PreferredLanguages = std::vector; - RegionWithName(StringUtf8Multilang const & name) : m_name(name) {} /// This function will take the following steps: diff --git a/generator/translation.cpp b/generator/translation.cpp new file mode 100644 index 0000000000..0165bb7059 --- /dev/null +++ b/generator/translation.cpp @@ -0,0 +1,48 @@ +#include "translation.hpp" + +#include "base/string_utils.hpp" +#include "coding/transliteration.hpp" + +namespace +{ +// Languages in order for better transliterations. This is kind +// of workaround before real made translations. +using PreferredLanguages = std::vector; + +const std::unordered_map + kPreferredLanguagesForTransliterate = { + {StringUtf8Multilang::GetLangIndex("ru"), {"en" /*English*/, "ru" /*Русский*/}}, + {StringUtf8Multilang::GetLangIndex("en"), {"en" /*English*/, "ru" /*Русский*/}}}; +} // namespace + +namespace generator +{ +std::string GetTranslatedOrTransliteratedName(StringUtf8Multilang const & name, + LanguageCode languageCode) +{ + std::string s = GetName(name, languageCode); + if (!s.empty() && strings::IsASCIIString(s)) + return s; + + s = GetName(name, StringUtf8Multilang::kInternationalCode); + if (!s.empty() && strings::IsASCIIString(s)) + return s; + + auto const fn = [&s](int8_t code, std::string const & name) { + if (code != StringUtf8Multilang::kDefaultCode && + Transliteration::Instance().Transliterate(name, code, s) && strings::IsASCIIString(s)) + { + return base::ControlFlow::Break; + } + + return base::ControlFlow::Continue; + }; + + if (kPreferredLanguagesForTransliterate.count(languageCode) && + !name.ForEachLanguage(kPreferredLanguagesForTransliterate.at(languageCode), fn)) + name.ForEach(fn); + + return s; +} + +} // namespace generator diff --git a/generator/translation.hpp b/generator/translation.hpp new file mode 100644 index 0000000000..1651d5d932 --- /dev/null +++ b/generator/translation.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "coding/string_utf8_multilang.hpp" + +namespace generator +{ +using LanguageCode = int8_t; + +inline std::string GetName(StringUtf8Multilang const & name, int8_t lang) +{ + std::string s; + VERIFY(name.GetString(lang, s) != s.empty(), ()); + return s; +} + +std::string GetTranslatedOrTransliteratedName(StringUtf8Multilang const & name, + LanguageCode languageCode); + +} // namespace generator \ No newline at end of file