VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Main/Resources.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Main/Resources.cpp')
-rw-r--r--src/Main/Resources.cpp94
1 files changed, 92 insertions, 2 deletions
diff --git a/src/Main/Resources.cpp b/src/Main/Resources.cpp
index 52b3cd4f..d8bab977 100644
--- a/src/Main/Resources.cpp
+++ b/src/Main/Resources.cpp
@@ -16,6 +16,14 @@
#ifdef TC_WINDOWS
#include "Main/resource.h"
+#else
+#ifdef TC_MACOSX
+#include "Application.h"
+#endif
+#include "Platform/File.h"
+#include "Platform/StringConverter.h"
+#include <stdio.h>
+#include "UserPreferences.h"
#endif
namespace VeraCrypt
@@ -39,7 +47,6 @@ namespace VeraCrypt
}
#endif // TC_WINDOWS
-
string Resources::GetLanguageXml ()
{
#ifdef TC_WINDOWS
@@ -49,6 +56,89 @@ namespace VeraCrypt
strBuf.CopyFrom (res);
return string (reinterpret_cast <char *> (strBuf.Ptr()));
#else
+ // get language from env LANG
+ // support: C,POSIX,
+ // support for e.g. german: de_DE.UTF-8, de.UTF8, de_DE, de
+ // not support e.g.: de@Euro
+ string defaultLang("en");
+#if defined (TC_MACOSX)
+ string filenamePrefix = StringConverter::ToSingle (Application::GetExecutableDirectory()) + "/../Resources/languages/Language.";
+#else
+ string filenamePrefix("/usr/share/veracrypt/languages/Language.");
+#endif
+ string filenamePost(".xml");
+ string filename = filenamePrefix + defaultLang + filenamePost;
+
+ UserPreferences Preferences;
+ Preferences.Load();
+ wstring preferredLang = Preferences.Language;
+#ifdef DEBUG
+ std::cout << "Config language: " << preferredLang << std::endl;
+#endif
+
+ if (preferredLang == L"system") {
+ if (const char *env_p = getenv("LANG")) {
+ string lang(env_p);
+#ifdef DEBUG
+ std::cout << "env $LANG: " << lang << std::endl;
+#endif
+ if (lang.size() > 1) {
+ int found = lang.find(".");
+ if (found > 1) {
+ string langTag = lang.substr(0, found);
+ string lowerLangTag(StringConverter::ToLower(langTag));
+ int foundUnderscore = lowerLangTag.find("_");
+ if (foundUnderscore > 0) {
+ lowerLangTag.replace(foundUnderscore, 1, 1, '-');
+ filename = filenamePrefix + lowerLangTag + filenamePost;
+ FilesystemPath xml(filename);
+ if (!xml.IsFile()) {
+ string shortLangTag = lowerLangTag.substr(0, foundUnderscore);
+ filename = filenamePrefix + shortLangTag + filenamePost;
+ FilesystemPath xml(filename);
+ if (!xml.IsFile()) {
+ filename = filenamePrefix + defaultLang + filenamePost;
+ }
+ }
+ } else {
+ filename = filenamePrefix + langTag + filenamePost;
+ FilesystemPath xml(filename);
+ if (!xml.IsFile()) {
+ filename = filenamePrefix + defaultLang + filenamePost;
+ }
+ }
+ } else {
+ string lowerLang(StringConverter::ToLower(lang));
+ filename = filenamePrefix + lowerLang + filenamePost;
+ FilesystemPath xml(filename);
+ if (!xml.IsFile()) {
+ int foundUnderscore = lowerLang.find("_");
+ if (foundUnderscore > 0) {
+ lowerLang.replace(foundUnderscore, 1, 1, '-');
+ filename = filenamePrefix + lowerLang + filenamePost;
+ FilesystemPath xml(filename);
+ if (!xml.IsFile()) {
+ filename = filenamePrefix + defaultLang + filenamePost;
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ filename = filenamePrefix + preferredLang + filenamePost;
+ }
+ FilesystemPath xml(filename);
+ if ( xml.IsFile() ){
+ File file;
+ file.Open (xml, File::OpenRead, File::ShareRead);
+ vector <byte> keyfileData (file.Length());
+ BufferPtr keyfileDataBuf (&keyfileData.front(), keyfileData.size());
+ file.ReadCompleteBuffer (keyfileDataBuf);
+ file.Close();
+ string langxml(keyfileData.begin(), keyfileData.end());
+ return langxml;
+ }
static byte LanguageXml[] =
{
# include "Common/Language.xml.h"
@@ -111,7 +201,7 @@ namespace VeraCrypt
wxImage image (stream);
image.Resize (wxSize (16, 12), wxPoint (0, 0));
-# ifdef __WXGTK__
+# if defined __WXGTK__ || defined TC_MACOSX
return wxBitmap (image.ConvertToMono (0, 0, 0), 1);
# else
return wxBitmap (image);