bff0db8f4f9440a63272faf7c2f9d42aeae326ec
[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
71 static char *long_locales[] = {
72         "",
73         "english",
74         "japanese",
75         "dutch",
76         "italian",
77         "german",
78         "finnish",
79         "swedish",
80         "french",
81         "spanish",
82         "catalan",
83         "czech",
84         "ptb",
85         "chs",
86         "cht",
87         "russian",
88         "croatian",
89         "serbian",
90         "ukrainian",
91         "polish",
92         "romanian",
93         "arabic",
94         "bulgarian",
95         "greek",
96         "korean"
97 };
98
99 static char short_locale_default[] = "";
100 static char short_locale_english[] = "en_US";
101 static char short_locale_japanese[] = "ja_JP";
102 static char short_locale_dutch[] = "nl_NL";
103 static char short_locale_italian[] = "it_IT";
104 static char short_locale_german[] = "de_DE";
105 static char short_locale_finnish[] = "fi_FI";
106 static char short_locale_swedish[] = "sv_SE";
107 static char short_locale_french[] = "fr_FR";
108 static char short_locale_spanish[] = "es_ES";
109 static char short_locale_catalan[] = "ca_AD";
110 static char short_locale_czech[] = "cs_CZ";
111 static char short_locale_bra_portuguese[] = "pt_BR";
112 static char short_locale_sim_chinese[] = "zh_CN";
113 static char short_locale_tra_chinese[] = "zh_TW";
114 static char short_locale_russian[] = "ru_RU";
115 static char short_locale_croatian[] = "hr_HR";
116 static char short_locale_serbian[] = "sr_RS";
117 static char short_locale_ukrainian[] = "uk_UA";
118 static char short_locale_polish[] = "pl_PL";
119 static char short_locale_romanian[] = "ro_RO";
120 static char short_locale_arabic[] = "ar_EG";
121 static char short_locale_bulgarian[] = "bg_BG";
122 static char short_locale_greek[] = "el_GR";
123 static char short_locale_korean[] = "ko_KR";
124
125 static char *short_locales[] = {
126                 short_locale_default,
127                 short_locale_english, /* us english is the default language of blender */
128                 short_locale_japanese,
129                 short_locale_dutch,
130                 short_locale_italian,
131                 short_locale_german,
132                 short_locale_finnish,
133                 short_locale_swedish,
134                 short_locale_french,
135                 short_locale_spanish,
136                 short_locale_catalan,
137                 short_locale_czech,
138                 short_locale_bra_portuguese,
139                 short_locale_sim_chinese,
140                 short_locale_tra_chinese,
141                 short_locale_russian,
142                 short_locale_croatian,
143                 short_locale_serbian,
144                 short_locale_ukrainian,
145                 short_locale_polish,
146                 short_locale_romanian,
147                 short_locale_arabic,
148                 short_locale_bulgarian,
149                 short_locale_greek,
150                 short_locale_korean,
151 };
152
153 void BLF_lang_init(void)
154 {
155         char *messagepath= BLI_get_folder(BLENDER_DATAFILES, "locale");
156         
157         BLI_strncpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT, sizeof(global_encoding_name));
158         
159         if (messagepath)
160                 BLI_strncpy(global_messagepath, messagepath, sizeof(global_messagepath));
161         else
162                 global_messagepath[0]= '\0';
163         
164 }
165
166 /* XXX WARNING!!! IN osx somehow the previous function call jumps in this one??? (ton, ppc) */
167 void BLF_lang_set(const char *str)
168 {
169         char *locreturn;
170         char *short_locale;
171 #if defined (_WIN32)
172         char *long_locale = long_locales[U.language];
173 #endif
174
175         if(str)
176                 short_locale = str;
177         else
178                 short_locale = short_locales[U.language];
179
180         if(short_locale)
181         {
182                 BLI_setenv("LANG", short_locale);
183                 BLI_setenv("LANGUAGE", short_locale);
184         }
185
186 #if defined (_WIN32)
187         locreturn= setlocale(LC_ALL, long_locale);
188         if (locreturn == NULL) {
189                 printf("Could not change locale to %s\n", long_locale);
190         }
191 #else
192         locreturn= setlocale(LC_ALL, short_locale);
193         if (locreturn == NULL) {
194                 char *short_locale_utf8 = BLI_sprintfN("%s.UTF-8", short_locale);
195
196                 locreturn= setlocale(LC_ALL, short_locale_utf8);
197                 if (locreturn == NULL) {
198                         printf("Could not change locale to %s nor %s\n", short_locale, short_locale_utf8);
199                 }
200
201                 MEM_freeN(short_locale_utf8);
202         }
203 #endif
204         else
205         {
206                 printf("Change locale to %s\n", locreturn );
207                 BLI_strncpy(global_language, locreturn, sizeof(global_language));
208         }
209         setlocale(LC_NUMERIC, "C");
210
211         textdomain(DOMAIN_NAME);
212         bindtextdomain(DOMAIN_NAME, global_messagepath);
213         /* bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name); */       
214 }
215
216 void BLF_lang_encoding(const char *str)
217 {
218         BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name));
219         /* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */
220 }
221
222 #else /* ! INTERNATIONAL */
223
224 void BLF_lang_init(void)
225 {
226         return;
227 }
228
229 void BLF_lang_encoding(const char *str)
230 {
231         (void)str;
232         return;
233 }
234
235 void BLF_lang_set(const char *str)
236 {
237         (void)str;
238         return;
239 }
240
241 #endif /* INTERNATIONAL */