diff --git a/TranslatorCpp/Languages/English.h b/TranslatorCpp/Languages/English.h index 2e16697..f28f6fd 100644 --- a/TranslatorCpp/Languages/English.h +++ b/TranslatorCpp/Languages/English.h @@ -110,4 +110,12 @@ struct English : public ENGLISH_BASE wt == word_type::pronoun || wt == verb; } + + static bool should_capitalize(const translator::word_form &w) + { + if (w.p_dw->wordtype == word_type::pronoun && w.word == "i") + return true; + + return false; + } }; \ No newline at end of file diff --git a/TranslatorCpp/Languages/Serbian.h b/TranslatorCpp/Languages/Serbian.h index 6cb98fd..9aea42d 100644 --- a/TranslatorCpp/Languages/Serbian.h +++ b/TranslatorCpp/Languages/Serbian.h @@ -153,4 +153,9 @@ struct Serbian : public SERBIAN_BASE wt == word_type::придев || wt == word_type::прилог; } + + static bool should_capitalize(const translator::word_form &w) + { + return false; + } }; \ No newline at end of file diff --git a/TranslatorCpp/Parse.cpp b/TranslatorCpp/Parse.cpp index bce4817..2ad8e88 100644 --- a/TranslatorCpp/Parse.cpp +++ b/TranslatorCpp/Parse.cpp @@ -68,6 +68,7 @@ int main(int argc, char *argv[]) if (stLang == "SR") { map sents; + setlocale(LC_ALL, ""); generate_random_sentences(sents, seed); set_wide(); for (auto const &pair : sents) @@ -126,4 +127,27 @@ int main(int argc, char *argv[]) cerr << "Unrecognized command" << endl; return -1; +} + +char translator::capitalize(char c) +{ + return toupper(c); +} + +wchar_t translator::capitalize(wchar_t c) +{ + wchar_t upper = towupper(c); + return upper; +} + +void translator::to_lower(basic_string& s) +{ + for (basic_string::iterator p = s.begin(); p != s.end(); ++p) + *p = tolower(*p); +} + +void translator::to_lower(basic_string& s) +{ + for (basic_string::iterator p = s.begin(); p != s.end(); ++p) + *p = towlower(*p); } \ No newline at end of file diff --git a/TranslatorCpp/language.h b/TranslatorCpp/language.h index de3f301..12db1c2 100644 --- a/TranslatorCpp/language.h +++ b/TranslatorCpp/language.h @@ -68,6 +68,10 @@ namespace translator } } + void to_lower(basic_string& s); + + void to_lower(basic_string& s); + template bool parse(typename Language::string_t s) { @@ -81,6 +85,10 @@ namespace translator parsing_triangle>> pt(vs.size()); + // Lowercase all the words + for (auto &word : vs) + to_lower(word); + // Lexical analysis for (unsigned int i = 0; i < vs.size(); i++) { diff --git a/TranslatorCpp/random_sentence.h b/TranslatorCpp/random_sentence.h index edfdd72..77e0bd3 100644 --- a/TranslatorCpp/random_sentence.h +++ b/TranslatorCpp/random_sentence.h @@ -5,6 +5,18 @@ namespace translator { + char capitalize(char c); + + wchar_t capitalize(wchar_t c); + + template + const string_t capitalize_string(const string_t& st) + { + string_t copy = st; + copy[0] = capitalize(copy[0]); + return copy; + } + template const rule& get_random_rule(std::default_random_engine& device, typename Language::word_type wt = Language::Sentence) { @@ -144,23 +156,24 @@ namespace translator } } - string_t ToString() const + string_t ToString(bool first_word=false) const { switch (t) { case RNode::string: - return st; + return first_word ? capitalize_string(st) : st; case RNode::word: { const word_form& w = p_dw->find_word_form(am); - return w.word; + return first_word || Language::should_capitalize(w) ? capitalize_string(w.word) : w.word; } case RNode::node: { string_t stSum; for (auto &child : children) { - stSum += child.ToString(); + stSum += child.ToString(first_word); + first_word = false; stSum += string_t::value_type(' '); } return stSum.substr(0, stSum.size() - 1); @@ -184,6 +197,6 @@ namespace translator RNode node(r, device); node.consolidate_attributes(device); - return node.ToString(); + return node.ToString(true); } } \ No newline at end of file