std::string translation_c::get_default_ui_locale() { std::string locale; #if defined(HAVE_LIBINTL_H) # if defined(SYS_WINDOWS) std::string env_var = get_environment_variable("LC_MESSAGES"); if (!env_var.empty() && (-1 != look_up_translation(env_var))) return env_var; env_var = get_environment_variable("LANG"); if (!env_var.empty() && (-1 != look_up_translation(env_var))) return env_var; char *data; int len = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, NULL, 0); if (0 < len) { data = (char *)safemalloc(len); memset(data, 0, len); if (0 != GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, data, len)) locale = data; safefree(data); int idx = translation_c::look_up_translation(locale); if (-1 != idx) locale = ms_available_translations[idx].get_locale(); } # else // SYS_WINDOWS char *data = setlocale(LC_MESSAGES, NULL); if (NULL != data) { std::string previous_locale = data; if (debugging_requested("locale")) mxinfo(boost::format("[get_default_ui_locale previous %1%]\n") % previous_locale); setlocale(LC_MESSAGES, ""); data = setlocale(LC_MESSAGES, NULL); if (NULL != data) locale = data; if (debugging_requested("locale")) mxinfo(boost::format("[get_default_ui_locale new %1%]\n") % locale); setlocale(LC_MESSAGES, previous_locale.c_str()); } else if (debugging_requested("locale")) mxinfo(boost::format("[get_default_ui_locale get previous failed]\n")); # endif // SYS_WINDOWS #endif // HAVE_LIBINTL_H return locale; }
void translation_c::set_active_translation(const std::string &locale) { int idx = look_up_translation(locale); ms_active_translation_idx = std::max(idx, 0); mxdebug_if(debugging_c::requested("locale"), boost::format("[translation_c::set_active_translation() active_translation_idx %1% for locale %2%]\n") % ms_active_translation_idx % locale); }
std::string translation_c::get_default_ui_locale() { std::string locale; #if defined(HAVE_LIBINTL_H) bool debug = debugging_c::requested("locale"); # if defined(SYS_WINDOWS) std::string env_var = mtx::sys::get_environment_variable("LC_MESSAGES"); if (!env_var.empty() && (-1 != look_up_translation(env_var))) return env_var; env_var = mtx::sys::get_environment_variable("LANG"); if (!env_var.empty() && (-1 != look_up_translation(env_var))) return env_var; auto lang_id = GetUserDefaultUILanguage(); int idx = translation_c::look_up_translation(lang_id & 0x3ff, (lang_id >> 10) & 0x3f); if (-1 != idx) locale = ms_available_translations[idx].get_locale(); mxdebug_if(debug, boost::format("[lang_id %|1$04x| idx %2% locale %3%\n") % lang_id % idx % locale); # else // SYS_WINDOWS char *data = setlocale(LC_MESSAGES, nullptr); if (data) { std::string previous_locale = data; mxdebug_if(debug, boost::format("[get_default_ui_locale previous %1%]\n") % previous_locale); setlocale(LC_MESSAGES, ""); data = setlocale(LC_MESSAGES, nullptr); if (data) locale = data; mxdebug_if(debug, boost::format("[get_default_ui_locale new %1%]\n") % locale); setlocale(LC_MESSAGES, previous_locale.c_str()); } else mxdebug_if(debug, boost::format("[get_default_ui_locale get previous failed]\n")); # endif // SYS_WINDOWS #endif // HAVE_LIBINTL_H return locale; }