complete the language-select feature
[blender.git] / source / blender / blenfont / intern / blf_lang.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  * 
23  * Contributor(s): Blender Foundation.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/blenfont/intern/blf_lang.c
29  *  \ingroup blf
30  */
31
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "BLF_api.h"
38
39 #ifdef INTERNATIONAL
40
41 #include <locale.h>
42 #include "libintl.h"
43
44 #include "DNA_userdef_types.h"
45
46 #include "DNA_listBase.h"
47 #include "DNA_vec_types.h"
48
49 #include "MEM_guardedalloc.h"
50
51 #include "BLI_linklist.h"       /* linknode */
52 #include "BLI_string.h"
53 #include "BLI_path_util.h"
54
55
56 #ifdef __APPLE__
57
58 #endif
59
60 #define DOMAIN_NAME "blender"
61 #define SYSTEM_ENCODING_DEFAULT "UTF-8"
62 #define FONT_SIZE_DEFAULT 12
63
64 /* locale options. */
65 static char global_messagepath[1024];
66 static char global_language[32];
67 static char global_encoding_name[32];
68
69 /* map from the rna_userdef.c:rna_def_userdef_system(BlenderRNA *brna):language_items */
70 static char locale_default[] = "";
71 static char locale_english[] = "en_US";
72 static char locale_japanese[] = "ja_JP";
73 static char locale_dutch[] = "nl_NL";
74 static char locale_italian[] = "it_IT";
75 static char locale_german[] = "de_DE";
76 static char locale_finnish[] = "fi_FI";
77 static char locale_swedish[] = "sv_SE";
78 static char locale_french[] = "fr_FR";
79 static char locale_spanish[] = "es_ES";
80 static char locale_catalan[] = "ca_AD";
81 static char locale_czech[] = "cs_CZ";
82 static char locale_bra_portuguese[] = "pt_BR";
83 static char locale_sim_chinese[] = "zh_CN";
84 static char locale_tra_chinese[] = "zh_TW";
85 static char locale_russian[] = "ru_RU";
86 static char locale_croatian[] = "hr_HR";
87 static char locale_serbian[] = "sr_RS";
88 static char locale_ukrainian[] = "uk_UA";
89 static char locale_polish[] = "pl_PL";
90 static char locale_romanian[] = "ro_RO";
91 static char locale_arabic[] = "ar_EG";
92 static char locale_bulgarian[] = "bg_BG";
93 static char locale_greek[] = "el_GR";
94 static char locale_korean[] = "ko_KR";
95
96 static char *lang_to_locale[] = {
97                 locale_default,
98                 locale_english, /* us english is the default language of blender */
99                 locale_japanese,
100                 locale_dutch,
101                 locale_italian,
102                 locale_german,
103                 locale_finnish,
104                 locale_swedish,
105                 locale_french,
106                 locale_spanish,
107                 locale_catalan,
108                 locale_czech,
109                 locale_bra_portuguese,
110                 locale_sim_chinese,
111                 locale_tra_chinese,
112                 locale_russian,
113                 locale_croatian,
114                 locale_serbian,
115                 locale_ukrainian,
116                 locale_polish,
117                 locale_romanian,
118                 locale_arabic,
119                 locale_bulgarian,
120                 locale_greek,
121                 locale_korean,
122 };
123
124 void BLF_lang_init(void)
125 {
126         char *messagepath= BLI_get_folder(BLENDER_DATAFILES, "locale");
127         
128         BLI_strncpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT, sizeof(global_encoding_name));
129         
130         if (messagepath)
131                 BLI_strncpy(global_messagepath, messagepath, sizeof(global_messagepath));
132         else
133                 global_messagepath[0]= '\0';
134         
135 }
136
137 /* XXX WARNING!!! IN osx somehow the previous function call jumps in this one??? (ton, ppc) */
138 void BLF_lang_set(const char *str)
139 {
140         char *locreturn;
141         if(str==NULL)
142                 str = lang_to_locale[U.language];
143         BLI_setenv("LANG", str);
144         BLI_setenv("LANGUAGE", str);
145
146         locreturn= setlocale(LC_ALL, str);
147         if (locreturn == NULL) {
148                 char *lang= BLI_sprintfN("%s.UTF-8", str);
149
150                 locreturn= setlocale(LC_ALL, lang);
151                 if (locreturn == NULL) {
152                         printf("could not change language to %s nor %s\n", str, lang);
153                 }
154
155                 MEM_freeN(lang);
156         }
157
158         setlocale(LC_NUMERIC, "C");
159
160         textdomain(DOMAIN_NAME);
161         bindtextdomain(DOMAIN_NAME, global_messagepath);
162         /* bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name); */
163         BLI_strncpy(global_language, str, sizeof(global_language));
164
165 //      printf( "<<< %s %s %s \n", setlocale(LC_MESSAGES,NULL), getenv("LANG"), getenv("LANGUAGE") );
166
167 }
168
169 void BLF_lang_encoding(const char *str)
170 {
171         BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name));
172         /* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */
173 }
174
175 #else /* ! INTERNATIONAL */
176
177 void BLF_lang_init(void)
178 {
179         return;
180 }
181
182 void BLF_lang_encoding(const char *str)
183 {
184         (void)str;
185         return;
186 }
187
188 void BLF_lang_set(const char *str)
189 {
190         (void)str;
191         return;
192 }
193
194 #endif /* INTERNATIONAL */