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:
Diffstat (limited to 'source/blender/blenfont/intern/blf_lang.c')
-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