diff options
Diffstat (limited to 'src/Main/Resources.cpp')
-rw-r--r-- | src/Main/Resources.cpp | 94 |
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); |