Mercurial > thymian
view templates/dictionary.cpp @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
line wrap: on
line source
#include "dictionary.h" #include <tntdb.h> #include <boost/algorithm/string.hpp> const std::vector<std::string> dictionary::supported_languages = {"gb", "no"}; std::map<std::string, std::map<std::string, std::string>> dictionary::m_inMemoryTranslations; template<typename T> std::string join(const std::vector<T> in, const std::string & separator =", ", // see 1. const std::string & concluder =" ") // see 1. { std::ostringstream ss; std::size_t i = 0; for(; i<in.size() - 1; i++) { ss << in[i] << separator; } ss << in[i] << concluder; return ss.str(); } std::string dictionary::translate(const std::string & what, const std::string &target_language, bool other_languages_too, std::map<std::string, std::string> &translations) { std::string result_translation; bool found = false; try { tntdb::Connection conn = tntdb::connect("sqlite:lang.db"); // TODO: prepared statement std::string v = "select " + join(supported_languages) + " from translations where source='" + what + "'"; tntdb::Result result = conn.select(v); for (tntdb::Result::const_iterator it = result.begin(); it != result.end(); ++it) { tntdb::Row row = *it; for(size_t i=0; i<row.size(); i++) { std::string row_name = boost::to_lower_copy(row.getName(i)); if(other_languages_too) { std::string temp; row[i].get(temp); translations[row_name] = temp; } if(row_name == boost::to_lower_copy(target_language)) { row[i].get(result_translation); found = true; } } } } catch (std::exception& ex) { std::cerr << ex.what(); return ""; } if(!found) { if(m_inMemoryTranslations.count(what)) { for(const auto& l : supported_languages) { if(m_inMemoryTranslations[what].count(l)) { translations[l] = m_inMemoryTranslations[what][l]; } } if(m_inMemoryTranslations[what].count(target_language)) { result_translation = m_inMemoryTranslations[what][target_language]; } } } return result_translation; } std::string dictionary::translate(const std::string &what, const std::string &target_language) { std::map<std::string, std::string> translations; return translate(what, target_language, false, translations); } void dictionary::add_translation(const std::string &key, const std::string &language, const std::string &translated) { m_inMemoryTranslations[key][language] = translated; }
