mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////
|
||||
|
||||
@@ -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
@@ -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
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user