From 70329296d44b9ce781447e4d4280a223e17a7df2 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 26 Dec 2011 14:52:36 +0000 Subject: Another fix for #29494: Problem loading translations at Blender's startup Reset only LANG variable to it's default value when setting locale to short/long name failed and set LANGUAGE to value calculated from LANG or value in user preferences (depending on if Default language is set) so correct language ill be used for messages even if locale files aren't generated. Also disabled i18n prints in non-debug run so console wouldn't be polluted by messages which aren't really informative for user now and might confuse. --- source/blender/blenfont/intern/blf_lang.c | 120 ++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 31 deletions(-) (limited to 'source/blender/blenfont/intern') 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 #include +#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 -- cgit v1.2.3