diff --git a/src/backend/generators.h b/src/backend/generators.h index c0975501..49f4ec16 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -550,8 +550,7 @@ namespace YAML { inline Emitter& operator << (Emitter& out, const boss::MessageContent& rhs) { out << BeginMap; - if (rhs.Language() == boss::g_lang_english) - out << Key << "lang" << Value << "eng"; + out << Key << "lang" << Value << boss::GetLangString(rhs.Language()); out << Key << "str" << Value << rhs.Str(); diff --git a/src/backend/helpers.cpp b/src/backend/helpers.cpp index e0af18ae..ea272bf4 100644 --- a/src/backend/helpers.cpp +++ b/src/backend/helpers.cpp @@ -245,6 +245,28 @@ namespace boss { return url; } + + std::string GetLangString(const unsigned int num) { + if (num == g_lang_english) + return "eng"; + else if (num == g_lang_spanish) + return "spa"; + else if (num == g_lang_russian) + return "rus"; + else + return ""; + } + + unsigned int GetLangNum(const std::string& str) { + if (boost::iequals(str, "eng")) + return g_lang_english; + else if (boost::iequals(str, "spa")) + return g_lang_spanish; + else if (boost::iequals(str, "rus")) + return g_lang_russian; + else + return g_lang_any; + } ////////////////////////////// diff --git a/src/backend/helpers.h b/src/backend/helpers.h index 83beeaec..c244030f 100644 --- a/src/backend/helpers.h +++ b/src/backend/helpers.h @@ -69,6 +69,10 @@ namespace boss { //Turns an absolute filesystem path into a valid file:// URL. std::string ToFileURL(const boost::filesystem::path& file); + //Converts between BOSS's global const value and the ISO 639-3 value for a language. + std::string GetLangString(const unsigned int num); + unsigned int GetLangNum(const std::string& str); + //Version class for more robust version comparisons. class Version { private: diff --git a/src/backend/parsers.h b/src/backend/parsers.h index e991feba..b66447c9 100644 --- a/src/backend/parsers.h +++ b/src/backend/parsers.h @@ -108,12 +108,8 @@ namespace YAML { static Node encode(const boss::MessageContent& rhs) { Node node; node["str"] = rhs.Str(); - - if (rhs.Language() == boss::g_lang_any) - node["lang"] = ""; - else if (rhs.Language() == boss::g_lang_english) - node["lang"] = "eng"; - + node["lang"] = boss::GetLangString(rhs.Language()); + return node; } @@ -122,15 +118,9 @@ namespace YAML { return false; std::string str = node["str"].as(); - std::string lang = node["lang"].as(); - unsigned int langNo; + unsigned int lang = boss::GetLangNum(node["lang"].as()); - if (boost::iequals(lang, "eng")) - langNo = boss::g_lang_english; - else - langNo = boss::g_lang_any; - - rhs = boss::MessageContent(str, langNo); + rhs = boss::MessageContent(str, lang); return true; } diff --git a/src/gui/editor.cpp b/src/gui/editor.cpp index 523e1f38..b8616cc0 100644 --- a/src/gui/editor.cpp +++ b/src/gui/editor.cpp @@ -29,15 +29,6 @@ using namespace std; -wxString Language[2] = { - translate("None Specified"), - wxT("English"), -/* wxString::FromUTF8("Español"), - wxT("Deutsch"), - wxString::FromUTF8("Русский"), - wxString::FromUTF8("简体中文")*/ -}; - wxString Type[3] = { translate("Note"), translate("Warning"), @@ -107,10 +98,7 @@ wxString MessageList::OnGetItemText(long item, long column) const { } else if (column == 2) { return FromUTF8(_messages[item].Condition()); } else { - if (_messages[item].ChooseContent(_language).Language() == boss::g_lang_any) - return Language[0]; - else - return Language[1]; + return Language[ GetLangIndex(boss::GetLangString(_messages[item].ChooseContent(_language).Language())) ]; } } @@ -832,7 +820,7 @@ MessageEditDialog::MessageEditDialog(wxWindow *parent, const wxString& title) : //Initialise controls. _type = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 3, Type); - _language = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 2, Language); + _language = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, Language); _condition = new wxTextCtrl(this, wxID_ANY); _str = new wxTextCtrl(this, wxID_ANY); @@ -922,11 +910,7 @@ void MessageEditDialog::SetMessage(const boss::Message& message) { vector contents = message.Content(); for (size_t i=0, max=contents.size(); i < max; ++i) { - if (contents[i].Language() == boss::g_lang_any) - _content->InsertItem(i, Language[0]); - else - _content->InsertItem(i, Language[1]); - + _content->InsertItem(i, Language[ GetLangIndex(boss::GetLangString(contents[i].Language())) ]); _content->SetItem(i, 1, FromUTF8(contents[i].Str())); } } @@ -948,11 +932,8 @@ boss::Message MessageEditDialog::GetMessage() const { for (size_t i=0, max=_content->GetItemCount(); i < max; ++i) { string str = string(_content->GetItemText(i, 1).ToUTF8()); - unsigned int lang; - if (_content->GetItemText(i, 0) == Language[0]) - lang = boss::g_lang_any; - else - lang = boss::g_lang_english; + unsigned int lang = GetLangNum(_content->GetItemText(i, 0)); + contents.push_back(boss::MessageContent(str, lang)); } @@ -960,11 +941,7 @@ boss::Message MessageEditDialog::GetMessage() const { } void MessageEditDialog::OnSelect(wxListEvent& event) { - if (_content->GetItemText(event.GetIndex(), 0) == Language[0]) - _language->SetSelection(0); - else - _language->SetSelection(1); - + _language->SetSelection(GetLangIndex(_content->GetItemText(event.GetIndex(), 0))); _str->SetValue(_content->GetItemText(event.GetIndex(), 1)); } diff --git a/src/gui/ids.cpp b/src/gui/ids.cpp index 4ee03696..edaf65cc 100644 --- a/src/gui/ids.cpp +++ b/src/gui/ids.cpp @@ -22,9 +22,18 @@ */ #include "ids.h" +#include "../backend/globals.h" +#include #include +wxString Language[4] = { + translate("None Specified"), + wxT("English"), + wxString::FromUTF8("Español"), + wxString::FromUTF8("Русский"), +}; + wxString translate(const std::string& str) { return wxString::FromUTF8(boost::locale::translate(str).str().c_str()); } @@ -36,3 +45,41 @@ wxString FromUTF8(const std::string& str) { wxString FromUTF8(const boost::format& f) { return FromUTF8(f.str()); } + +unsigned int GetLangIndex(const std::string& str) { + if (boost::iequals(str, "eng")) + return 1; + else if (boost::iequals(str, "spa")) + return 2; + else if (boost::iequals(str, "rus")) + return 3; + else + return 0; +} + +std::string GetLangStringFromIndex(const unsigned int index) { + if (index == 1) + return "eng"; + else if (index == 2) + return "spa"; + else if (index == 3) + return "rus"; + else + return ""; +} + +unsigned int GetLangNum(const wxString& str) { + for (int i=0; i < 4; ++i) { + if (str == Language[i]) + return GetLangNum(GetLangStringFromIndex(i)); + } + return boss::g_lang_any; +} + +unsigned int GetLangIndex(const wxString& str) { + for (int i=0; i < 4; ++i) { + if (str == Language[i]) + return i; + } + return 0; +} diff --git a/src/gui/ids.h b/src/gui/ids.h index 3f86ad13..dbb29e56 100644 --- a/src/gui/ids.h +++ b/src/gui/ids.h @@ -70,10 +70,24 @@ enum { BUTTON_MoveDown, }; +extern wxString Language[4]; + wxString translate(const std::string& str); wxString FromUTF8(const std::string& str); wxString FromUTF8(const boost::format& f); +//Get the index in the above array of the language corresponding to a given ISO 639-3 code. +unsigned int GetLangIndex(const std::string& str); + +//Get the index in the above array of one of its strings. +unsigned int GetLangIndex(const wxString& str); + +//Get the ISO 639-3 code corresponding to the language at a given index in the above array. +std::string GetLangStringFromIndex(const unsigned int index); + +//Get the BOSS constant for the language string in the above array. +unsigned int GetLangNum(const wxString& str); + #endif diff --git a/src/gui/main.cpp b/src/gui/main.cpp index fbea8d10..57f68e2f 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -423,9 +423,7 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { messages.insert(messages.end(), ulist_messages.begin(), ulist_messages.end()); //Set language. - unsigned int lang = boss::g_lang_any; - if (_settings["Language"].as() == "eng") - lang = boss::g_lang_english; + unsigned int lang = GetLangNum(_settings["Language"].as()); //Merge plugin list, masterlist and userlist plugin data. map consistencyIssues; @@ -736,9 +734,7 @@ void Launcher::OnEditMetadata(wxCommandEvent& event) { progDia->Pulse(); - unsigned int lang = boss::g_lang_any; - if (_settings["Language"].as() == "eng") - lang = boss::g_lang_english; + unsigned int lang = GetLangNum(_settings["Language"].as()); //Create editor window. Editor *editor = new Editor(this, translate("BOSS: Metadata Editor"), _game.UserlistPath().string(), installed, ulist_plugins, lang); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 5a7dbed5..540bfb03 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -46,15 +46,13 @@ SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node wxString Language[] = { wxT("English"), - /* wxString::FromUTF8("Español"), - wxT("Deutsch"), + wxString::FromUTF8("Español"), wxString::FromUTF8("Русский"), - wxString::FromUTF8("简体中文")*/ }; //Initialise controls. GameChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, Games); - LanguageChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, Language); + LanguageChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, Language); DebugVerbosityChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, DebugVerbosity); gamesList = new wxListView(this, LIST_Games, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL); @@ -147,9 +145,7 @@ SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node void SettingsFrame::SetDefaultValues() { if (_settings["Language"]) { - string lang = _settings["Language"].as(); - if (lang == "eng") - LanguageChoice->SetSelection(0); + LanguageChoice->SetSelection(GetLangIndex(_settings["Language"].as())); } if (_settings["Game"]) { @@ -201,12 +197,8 @@ void SettingsFrame::OnQuit(wxCommandEvent& event) { _settings["Game"] = "auto"; else _settings["Game"] = _games[GameChoice->GetSelection() - 1].FolderName(); - - switch (LanguageChoice->GetSelection()) { - case 0: - _settings["Language"] = "eng"; - break; - } + + _settings["Language"] = GetLangStringFromIndex(LanguageChoice->GetSelection()); _settings["Debug Verbosity"] = DebugVerbosityChoice->GetSelection();