Browse Source

Initialization: set fallback locale as environment variable

The scope of `std::locale::global` appears to be smaller than `setenv("LC_ALL", ...)` and insufficient to fix messed up locale settings for the whole application.
0.13
dexX7 10 years ago
parent
commit
ba0fa0d9bc
No known key found for this signature in database
GPG Key ID: 7675E31CF5719832
  1. 7
      src/util.cpp

7
src/util.cpp

@ -723,18 +723,19 @@ void RenameThread(const char* name)
void SetupEnvironment() void SetupEnvironment()
{ {
std::locale loc("C");
// On most POSIX systems (e.g. Linux, but not BSD) the environment's locale // On most POSIX systems (e.g. Linux, but not BSD) the environment's locale
// may be invalid, in which case the "C" locale is used as fallback. // may be invalid, in which case the "C" locale is used as fallback.
#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
try { try {
std::locale(""); // Raises a runtime error if current locale is invalid loc = std::locale(""); // Raises a runtime error if current locale is invalid
} catch (const std::runtime_error&) { } catch (const std::runtime_error&) {
std::locale::global(std::locale("C")); setenv("LC_ALL", "C", 1);
} }
#endif #endif
// The path locale is lazy initialized and to avoid deinitialization errors // The path locale is lazy initialized and to avoid deinitialization errors
// in multithreading environments, it is set explicitly by the main thread. // in multithreading environments, it is set explicitly by the main thread.
boost::filesystem::path::imbue(std::locale()); boost::filesystem::path::imbue(loc);
} }
void SetThreadPriority(int nPriority) void SetThreadPriority(int nPriority)

Loading…
Cancel
Save