t_boolean bultin_setenv(char **arguments) { if (string_equality(arguments[0], "setenv") == TRUE) { if (arguments[1]) { if (is_environement_variable(arguments[1]) == FALSE) set_new_environment_variable(arguments[1]); set_environment_variable(arguments[1], arguments[2]); return (SUCCESS); } ft_put_strsplit(g_environment); return (SUCCESS); } return(FAILURE); }
void init_locales(std::string locale) { translation_c::initialize_available_translations(); if (debugging_requested("locale")) mxinfo(boost::format("[init_locales start: locale %1%]\n") % locale); std::string locale_dir; std::string default_locale = translation_c::get_default_ui_locale(); if (-1 == translation_c::look_up_translation(locale)) { if (debugging_requested("locale")) mxinfo(boost::format("[init_locales lookup failed; clearing locale]\n")); locale = ""; } if (locale.empty()) { locale = default_locale; if (debugging_requested("locale")) mxinfo(boost::format("[init_locales setting to default locale %1%]\n") % locale); } # if defined(SYS_WINDOWS) set_environment_variable("LANGUAGE", ""); if (!locale.empty()) { // The Windows system headers define LC_MESSAGES but // Windows itself doesn't know it and treats "set_locale(LC_MESSAGES, ...)" // as an error. gettext uses the LANG and LC_MESSAGE environment variables instead. // Windows knows two environments: the system environment that's // modified by SetEnvironmentVariable() and the C library's cache // of said environment which is modified via _putenv(). set_environment_variable("LANG", locale); set_environment_variable("LC_MESSAGES", locale); translation_c::set_active_translation(locale); // Boost's path class uses wide chars on Windows for path // names. Tell that all narrow strings are encoded in UTF-8. std::locale utf8_locale(std::locale(), new mtx::utf8_codecvt_facet); std::locale::global(utf8_locale); boost::filesystem::path::imbue(utf8_locale); } locale_dir = get_installation_path() + "\\locale"; # else // SYS_WINDOWS std::string chosen_locale; try { locale_string_c loc_default(default_locale); std::string loc_req_with_default_codeset(locale_string_c(locale).set_codeset_and_modifier(loc_default).str()); if (setlocale(LC_MESSAGES, loc_req_with_default_codeset.c_str()) != NULL) chosen_locale = loc_req_with_default_codeset; else if (setlocale(LC_MESSAGES, locale.c_str()) != NULL) chosen_locale = locale; else { std::string loc_req_with_utf8 = locale_string_c(locale).set_codeset_and_modifier(locale_string_c("dummy.UTF-8")).str(); if (setlocale(LC_MESSAGES, loc_req_with_utf8.c_str()) != NULL) chosen_locale = loc_req_with_utf8; } } catch (mtx::locale_string_format_x &error) { if (debugging_requested("locale")) mxinfo(boost::format("[init_locales format error in %1%]\n") % error.error()); } if (debugging_requested("locale")) mxinfo(boost::format("[init_locales chosen locale %1%]\n") % chosen_locale); // Hard fallback to "C" locale if no suitable locale was // selected. This can happen if the system has no locales for // "en_US" or "en_US.UTF-8" compiled. if (chosen_locale.empty() && (setlocale(LC_MESSAGES, "C") != NULL)) chosen_locale = "C"; if (chosen_locale.empty()) mxerror(Y("The locale could not be set properly. Check the LANG, LC_ALL and LC_MESSAGES environment variables.\n")); std::locale utf8_locale(std::locale(), new mtx::utf8_codecvt_facet); std::locale::global(utf8_locale); translation_c::set_active_translation(chosen_locale); locale_dir = MTX_LOCALE_DIR; # endif // SYS_WINDOWS # if defined(SYS_APPLE) int result = setenv("LC_MESSAGES", chosen_locale.c_str(), 1); if (debugging_requested("locale")) mxinfo(boost::format("[init_locales setenv() return code: %1%]\n") % result); # endif bindtextdomain("mkvtoolnix", locale_dir.c_str()); textdomain("mkvtoolnix"); bind_textdomain_codeset("mkvtoolnix", "UTF-8"); }