Issue #20 work.

Added support for Russian and Spanish since they have translations in
the Skyrim masterlist already. Implemented language variable 'transform'
functions in helpers.h/cpp and ids.h/cpp so that they (along with
globals.h/cpp) are the only files that would need updating to add new
language support.
This commit is contained in:
WrinklyNinja
2013-06-16 23:17:04 +01:00
parent ea597945e8
commit 91f742220b
9 changed files with 105 additions and 64 deletions
+1 -2
View File
@@ -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();
+22
View File
@@ -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;
}
//////////////////////////////
+4
View File
@@ -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:
+4 -14
View File
@@ -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>();
std::string lang = node["lang"].as<std::string>();
unsigned int langNo;
unsigned int lang = boss::GetLangNum(node["lang"].as<std::string>());
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;
}
+6 -29
View File
@@ -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<boss::MessageContent> 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));
}
+47
View File
@@ -22,9 +22,18 @@
*/
#include "ids.h"
#include "../backend/globals.h"
#include <boost/algorithm/string.hpp>
#include <boost/locale.hpp>
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;
}
+14
View File
@@ -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
+2 -6
View File
@@ -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<string>() == "eng")
lang = boss::g_lang_english;
unsigned int lang = GetLangNum(_settings["Language"].as<string>());
//Merge plugin list, masterlist and userlist plugin data.
map<string, bool> consistencyIssues;
@@ -736,9 +734,7 @@ void Launcher::OnEditMetadata(wxCommandEvent& event) {
progDia->Pulse();
unsigned int lang = boss::g_lang_any;
if (_settings["Language"].as<string>() == "eng")
lang = boss::g_lang_english;
unsigned int lang = GetLangNum(_settings["Language"].as<string>());
//Create editor window.
Editor *editor = new Editor(this, translate("BOSS: Metadata Editor"), _game.UserlistPath().string(), installed, ulist_plugins, lang);
+5 -13
View File
@@ -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<string>();
if (lang == "eng")
LanguageChoice->SetSelection(0);
LanguageChoice->SetSelection(GetLangIndex(_settings["Language"].as<string>()));
}
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();