[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42878] trunk/blender/source/blender/ blenfont/intern/blf_lang.c: Another fix for #29494: Problem loading translations at Blender's startup

Sergey Sharybin sergey.vfx at gmail.com
Mon Dec 26 15:52:37 CET 2011


Revision: 42878
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42878
Author:   nazgul
Date:     2011-12-26 14:52:36 +0000 (Mon, 26 Dec 2011)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/blenfont/intern/blf_lang.c

Modified: trunk/blender/source/blender/blenfont/intern/blf_lang.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_lang.c	2011-12-26 14:52:21 UTC (rev 42877)
+++ trunk/blender/source/blender/blenfont/intern/blf_lang.c	2011-12-26 14:52:36 UTC (rev 42878)
@@ -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 @@
 	"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 @@
 	
 }
 
+/* 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 @@
 	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", default_lang);
+			BLI_setenv("LANGUAGE", default_language);
+		}
 
-		BLI_setenv("LANG", locale);
-		BLI_setenv("LANGUAGE", locale);
+		locreturn= setlocale(LC_ALL, short_locale);
 
-		locreturn= setlocale(LC_ALL, locale);
+		if(locreturn == NULL) {
+			char *short_locale_utf8= NULL;
 
-		if (locreturn == NULL) {
-			char *short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale);
+			if(short_locale[0]) {
+				short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale);
+				locreturn= setlocale(LC_ALL, short_locale_utf8);
+			}
 
-			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




More information about the Bf-blender-cvs mailing list