summaryrefslogtreecommitdiff
path: root/library/localization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'library/localization.cpp')
-rw-r--r--library/localization.cpp198
1 files changed, 198 insertions, 0 deletions
diff --git a/library/localization.cpp b/library/localization.cpp
new file mode 100644
index 00000000..328f37be
--- /dev/null
+++ b/library/localization.cpp
@@ -0,0 +1,198 @@
+#include "localization.h"
+#include <wx/msgdlg.h>
+#include "resources.h"
+#include "globalFunctions.h"
+#include <fstream>
+#include <set>
+
+//_("Browse") <- dummy string for wxDirPickerCtrl to be recognized by automatic text extraction!
+
+
+struct TranslationLine
+{
+ wxString original;
+ wxString translation;
+
+ bool operator<(const TranslationLine& b) const
+ {
+ return (original < b.original);
+ }
+};
+
+class Translation : public std::set<TranslationLine> {};
+
+
+CustomLocale::CustomLocale() :
+ wxLocale(),
+ currentLanguage(wxLANGUAGE_ENGLISH)
+{
+ translationDB = new Translation;
+}
+
+
+CustomLocale::~CustomLocale()
+{
+ delete translationDB;
+}
+
+
+inline
+void exchangeEscapeChars(wxString& data)
+{
+ wxString output;
+
+ const wxChar* input = data.c_str();
+
+ wxChar value;
+ while ((value = *input) != wxChar(0))
+ {
+ //read backslash
+ if (value == wxChar('\\'))
+ {
+ //read next character
+ ++input;
+ if ((value = *input) == wxChar(0))
+ break;
+
+ switch (value)
+ {
+ case wxChar('\\'):
+ output += wxChar('\\');
+ break;
+ case wxChar('n'):
+ output += wxChar('\n');
+ break;
+ case wxChar('t'):
+ output += wxChar('\t');
+ break;
+ case wxChar('\"'):
+ output += wxChar('\"');
+ break;
+ default:
+ output += value;
+ }
+ }
+ else
+ output += value;
+
+ ++input;
+ }
+ data = output;
+}
+
+
+void CustomLocale::setLanguage(const int language)
+{
+ currentLanguage = language;
+
+ std::string languageFile;
+ switch (language)
+ {
+ case wxLANGUAGE_CHINESE_SIMPLIFIED:
+ languageFile = "Languages/chinese_simple.lng";
+ break;
+ case wxLANGUAGE_DUTCH:
+ languageFile = "Languages/dutch.lng";
+ break;
+ case wxLANGUAGE_FRENCH:
+ languageFile = "Languages/french.lng";
+ break;
+ case wxLANGUAGE_GERMAN:
+ languageFile = "Languages/german.lng";
+ break;
+ case wxLANGUAGE_HUNGARIAN:
+ languageFile = "Languages/hungarian.lng";
+ break;
+ case wxLANGUAGE_ITALIAN:
+ languageFile = "Languages/italian.lng";
+ break;
+ case wxLANGUAGE_JAPANESE:
+ languageFile = "Languages/japanese.lng";
+ break;
+ case wxLANGUAGE_POLISH:
+ languageFile = "Languages/polish.lng";
+ break;
+ case wxLANGUAGE_PORTUGUESE:
+ languageFile = "Languages/portuguese.lng";
+ break;
+ case wxLANGUAGE_PORTUGUESE_BRAZILIAN:
+ languageFile = "Languages/portuguese_br.lng";
+ break;
+ case wxLANGUAGE_SLOVENIAN:
+ languageFile = "Languages/slovenian.lng";
+ break;
+ case wxLANGUAGE_SPANISH:
+ languageFile = "Languages/spanish.lng";
+ break;
+ default:
+ languageFile.clear();
+ currentLanguage = wxLANGUAGE_ENGLISH;
+ }
+
+ static bool initialized = false; //wxLocale is a global too!
+ if (!initialized)
+ {
+ initialized = true;
+ wxLocale::Init(currentLanguage, wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING);
+ }
+
+ //load language file into buffer
+ translationDB->clear();
+ const int bufferSize = 100000;
+ char temp[bufferSize];
+ if (!languageFile.empty())
+ {
+ std::ifstream langFile(languageFile.c_str(), std::ios::binary);
+ if (langFile)
+ {
+ TranslationLine currentLine;
+
+ //Delimiter:
+ //----------
+ //Linux: 0xa \n
+ //Mac: 0xd \r
+ //Win: 0xd 0xa \r\n <- language files are in Windows format
+ for (int rowNumber = 0; langFile.getline(temp, bufferSize, 0xd); ++rowNumber) //specify delimiter explicitly
+ {
+ langFile.get(); //discard the 0xa character
+
+ wxString formattedString = wxString::FromUTF8(temp);
+ //wxString formattedString = wxString::From8BitData(temp);
+
+ exchangeEscapeChars(formattedString);
+
+ if (rowNumber%2 == 0)
+ currentLine.original = formattedString;
+ else
+ {
+ currentLine.translation = formattedString;
+ translationDB->insert(currentLine);
+ }
+ }
+ langFile.close();
+ }
+ else
+ wxMessageBox(wxString(_("Error reading file:")) + wxT(" \"") + wxString(languageFile.c_str(), wxConvUTF8) + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR);
+ }
+ else
+ ; //if languageFile is empty texts will be english per default
+
+ //these global variables need to be redetermined on language selection
+ GlobalResources::DECIMAL_POINT = _(".");
+ GlobalResources::THOUSANDS_SEPARATOR = _(",");
+}
+
+
+const wxChar* CustomLocale::GetString(const wxChar* szOrigString, const wxChar* szDomain) const
+{
+ TranslationLine currentLine;
+ currentLine.original = szOrigString;
+
+ //look for translation in buffer table
+ const Translation::iterator i = translationDB->find(currentLine);
+ if (i != translationDB->end())
+ return i->translation.c_str();
+
+ //fallback
+ return szOrigString;
+}
bgstack15