Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-12-26 18:52:36 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2011-12-26 18:52:36 +0400
commit70329296d44b9ce781447e4d4280a223e17a7df2 (patch)
tree21bffe0b2f090d032e4efc4b43358f75fcaa898e /source/blender/blenfont/intern
parent7bc43f36935e5c5a5f54428ed0adb84407a60603 (diff)
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.
Diffstat (limited to 'source/blender/blenfont/intern')
-rw-r--r--source/blender/blenfont/intern/blf_lang.c120
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