Fix T43544: Runtime Error when Locale is not valid

This is not a real fix and only prevents crash, textures IO might be not
working totally correct if they're unicode path or so. Proper solution
would be to detect which locale we can use and set LANG, LC_ALL and friends.
This commit is contained in:
Sergey Sharybin 2015-02-03 17:34:05 +05:00
parent 1667e68797
commit 701a7dcc87
Notes: blender-bot 2023-02-14 09:32:01 +01:00
Referenced by issue #43567, Freestyle On/Off keyframe is being ignored
Referenced by issue #43544, Runtime Error when Locale is not valid
1 changed files with 30 additions and 0 deletions

View File

@ -33,6 +33,10 @@
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32
# include <locale.h>
#endif
#include "RNA_types.h"
#include "BLF_translation.h" /* own include */
@ -189,7 +193,33 @@ void BLF_lang_init(void)
{
#ifdef WITH_INTERNATIONAL
const char * const messagepath = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale");
#endif
/* Make sure LANG is correct and wouldn't cause std::rumtime_error. */
#ifndef _WIN32
/* TODO(sergey): This code only ensures LANG is set properly, so later when
* Cycles will try to use file system API from boost there'll be no runtime
* exception generated by std::locale() which _requires_ having proper LANG
* set in the environment.
*
* Ideally we also need to ensure LC_ALL, LC_MESSAGES and others are also
* set to a proper value, but currently it's not a huge deal and doesn't
* cause any headache.
*
* Would also be good to find nicer way to check if LANG is correct.
*/
const char *lang = getenv("LANG");
if(lang != NULL) {
char *old_locale = setlocale(LC_ALL, NULL);
if (setlocale(LC_ALL, lang) == NULL) {
setenv("LANG", "C", 1);
printf("Warning: Falling back to the standard locale (\"C\")\n");
}
setlocale(LC_ALL, old_locale);
}
#endif
#ifdef WITH_INTERNATIONAL
if (messagepath) {
bl_locale_init(messagepath, TEXT_DOMAIN_NAME);
fill_locales();