diff options
-rw-r--r-- | source/blender/blenfont/intern/blf_lang.c | 120 |
1 files changed, 89 insertions, 31 deletions
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c index 6fd868cd074..d62cee6a987 100644 --- a/source/blender/blenfont/intern/blf_lang.c +++ b/source/blender/blenfont/intern/blf_lang.c @@ -32,6 +32,8 @@ #include <stdlib.h> #include <string.h> +#include "BKE_global.h" + #include "BLF_api.h" #include "BLF_translation.h" /* own include */ @@ -81,8 +83,13 @@ static const char *locales[] = { "catalan", "ca_AD", "czech", "cs_CZ", "ptb", "pt_BR", +#if defined (_WIN32) && !defined(FREE_WINDOWS) "Chinese (Simplified)_China.1252", "zh_CN", "Chinese (Traditional)_China.1252", "zh_TW", +#else + "chs", "zh_CN", + "cht", "zh_TW", +#endif "russian", "ru_RU", "croatian", "hr_HR", "serbian", "sr_RS", @@ -115,15 +122,50 @@ void BLF_lang_init(void) } +/* get LANG/LANGUAGE environment variable */ +static void get_language_variable(const char *varname, char *var, int maxlen) +{ + char *env= getenv(varname); + + if(env) { + char *s; + + /* store defaul locale */ + BLI_strncpy(var, env, maxlen); + + /* use first language as default */ + s= strchr(var, ':'); + if(s) + s[0]= 0; + } +} + +/* get language to be used based on locale(which might be empty when using default language) and + * LANG environment variable + */ +static void get_language(const char *locale, const char *lang, char *language, int maxlen) +{ + if(locale[0]) { + BLI_strncpy(language, locale, maxlen); + } + else { + char *s; + + BLI_strncpy(language, lang, maxlen); + + s= strchr(language, '.'); + if(s) + s[0]= 0; + } +} + /* XXX WARNING!!! IN osx somehow the previous function call jumps in this one??? (ton, ppc) */ void BLF_lang_set(const char *str) { char *locreturn; const char *short_locale; int ok= 1; -#if defined (_WIN32) && !defined(FREE_WINDOWS) - const char *long_locale = locales[ 2 * U.language]; -#endif + const char *long_locale = locales[2 * U.language]; if((U.transopts&USER_DOTRANSLATE)==0) return; @@ -149,56 +191,72 @@ void BLF_lang_set(const char *str) locreturn= setlocale(LC_ALL, long_locale); if (locreturn == NULL) { - printf("Could not change locale to %s\n", long_locale); + if(G.debug & G_DEBUG) + printf("Could not change locale to %s\n", long_locale); + ok= 0; } #else { - const char *locale; - static char default_locale[64]="\0"; + static char default_lang[64]="\0"; + static char default_language[64]="\0"; - if(default_locale[0]==0) { - char *env_language= getenv("LANGUAGE"); + if(default_lang[0]==0) + get_language_variable("LANG", default_lang, sizeof(default_lang)); - if(env_language) { - char *s; + if(default_language[0]==0) + get_language_variable("LANGUAGE", default_language, sizeof(default_language)); - /* store defaul locale */ - BLI_strncpy(default_locale, env_language, sizeof(default_locale)); + if(short_locale[0]) { + if(G.f & G_DEBUG) + printf("Setting LANG= and LANGUAGE to %s\n", short_locale); - /* use first language as default */ - s= strchr(default_locale, ':'); - if(s) s[0]= 0; - } + BLI_setenv("LANG", short_locale); + BLI_setenv("LANGUAGE", short_locale); } + else { + if(G.f & G_DEBUG) + printf("Setting LANG=%s and LANGUAGE=%s\n", default_lang, default_language); - if(short_locale[0]) - locale= short_locale; - else - locale= default_locale; - - BLI_setenv("LANG", locale); - BLI_setenv("LANGUAGE", locale); + BLI_setenv("LANG", default_lang); + BLI_setenv("LANGUAGE", default_language); + } - locreturn= setlocale(LC_ALL, locale); + locreturn= setlocale(LC_ALL, short_locale); - if (locreturn == NULL) { - char *short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale); + if(locreturn == NULL) { + char *short_locale_utf8= NULL; - locreturn= setlocale(LC_ALL, short_locale_utf8); + if(short_locale[0]) { + short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale); + locreturn= setlocale(LC_ALL, short_locale_utf8); + } if (locreturn == NULL) { - printf("Could not change locale to %s nor %s\n", short_locale, short_locale_utf8); + char language[65]; + + get_language(long_locale, default_lang, language, sizeof(language)); + + if(G.f & G_DEBUG) { + if(short_locale[0]) + printf("Could not change locale to %s nor %s\n", short_locale, short_locale_utf8); + else + printf("Could not reset locale\n"); + + printf("Fallback to LANG=%s and LANGUAGE=%s\n", default_lang, language); + } /* fallback to default settings */ + BLI_setenv("LANG", default_lang); + BLI_setenv("LANGUAGE", language); + locreturn= setlocale(LC_ALL, ""); - BLI_setenv("LANG", default_locale); - BLI_setenv("LANGUAGE", default_locale); ok= 0; } - MEM_freeN(short_locale_utf8); + if(short_locale_utf8) + MEM_freeN(short_locale_utf8); } } #endif |