store locales, .Blanguage, and .bfont.ttf inside of Resources folder of
[blender.git] / source / blender / src / language.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is written by Rob Haarsma (phase)
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL/BL DUAL LICENSE BLOCK *****
28  */
29
30 /* dynamic popup generation for languages */
31
32 #ifdef INTERNATIONAL
33
34 #include <string.h>
35 #include <stdlib.h>
36
37 #include "DNA_userdef_types.h"
38
39 #include "BKE_global.h"         /* G */
40 #include "BKE_utildefines.h"
41
42 #include "BLI_blenlib.h"
43 #include "BLI_linklist.h"       /* linknode */
44
45 #include "BIF_language.h"
46 #include "BIF_space.h"          /* allqueue() */
47 #include "BIF_toolbox.h"        /* error() */
48
49 #include "MEM_guardedalloc.h"   /* vprintf, etc ??? */
50
51 #include "mydevice.h"           /* REDRAWALL */
52
53 #include "FTF_Api.h"
54
55 typedef struct _LANGMenuEntry LANGMenuEntry;
56 struct _LANGMenuEntry {
57         LANGMenuEntry *next;
58
59         char *line;
60         char *language;
61         char *code;
62         int id;
63 };
64
65 static LANGMenuEntry *langmenu= 0;
66
67 static int tot_lang = 0;
68
69
70 char *fontsize_pup(void)
71 {
72         static char string[1024];
73         char formatstring[1024];
74
75         strcpy(formatstring, "Choose Font Size: %%t|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d|%s %%x%d");
76
77         sprintf(string, formatstring,
78                         "Font Size:   8",               8,
79                         "Font Size:   9",               9,
80                         "Font Size:  10",               10,
81                         "Font Size:  11",               11,
82                         "Font Size:  12",               12,
83                         "Font Size:  13",               13,
84                         "Font Size:  14",               14,
85                         "Font Size:  15",               15,
86                         "Font Size:  16",               16
87                );
88
89         return (string);
90 }
91
92
93 char *language_pup(void)
94 {
95         LANGMenuEntry *lme = langmenu;
96         static char string[1024];
97         static char tmp[1024];
98
99         if(tot_lang == 0)
100                 sprintf(string, "Choose Language: %%t|Language:  English %%x0");
101         else {
102                 sprintf(string, "Choose Language: %%t");
103                 while(lme) {
104                         sprintf(tmp, "|Language:  %s %%x%d", lme->language, lme->id);
105                         strcat(string, tmp);
106                         lme= lme->next;
107                 }
108         }
109
110         return string;
111 }
112
113
114 LANGMenuEntry *find_language(short langid){
115         LANGMenuEntry *lme = langmenu;
116
117         while(lme) {
118                 if(lme->id == langid)
119                         return lme;
120
121                 lme=lme->next;
122         }
123         return NULL;
124 }
125
126
127 void lang_setlanguage(void) {
128         LANGMenuEntry *lme;
129
130         lme = find_language(U.language);
131         if(lme) FTF_SetLanguage(lme->code);
132         else FTF_SetLanguage("en_US");
133 }
134
135
136 void set_interface_font(char *str) {
137         char di[FILE_MAXDIR];
138
139         if(FTF_SetFont(str, U.fontsize)) {
140                 lang_setlanguage();
141                 BLI_split_dirfile(str, di, U.fontname);
142
143                 if(strlen(di) < FILE_MAXDIR) strcpy(U.fontdir, di);
144
145                 G.ui_international = TRUE;
146         } else {
147                 sprintf(U.fontname, "Invalid font.");
148                 G.ui_international = FALSE;
149         }
150         allqueue(REDRAWALL, 0);
151 }
152
153
154 void start_interface_font(void) {
155         char tstr[FILE_MAXDIR+FILE_MAXFILE];
156         int result = 0;
157 #ifdef __APPLE__
158         char *bundlepath;
159 #endif
160         
161         /* hack to find out if we have saved language/font settings.
162            if not, set defaults and try .bfont.tff --phase */
163         
164         if(U.fontsize != 0) { // we have saved user settings
165                 // try load the font from the font dir
166                 BLI_make_file_string("/", tstr, U.fontdir, U.fontname);
167                 result = FTF_SetFont(tstr, U.fontsize);
168
169                 if(!result) {   // else try loading font from current dir
170                         result = FTF_SetFont(U.fontname, U.fontsize);
171                 }
172         } else {
173                 U.language= 0;
174                 U.fontsize= 11;
175                 U.encoding= 0;
176
177 #ifdef __APPLE__
178                 bundlepath = BLI_getbundle();
179                 strcpy(tstr, bundlepath);
180                 strcat(tstr, "/Contents/Resources/");
181                 strcat(tstr, ".bfont.ttf");
182                 result = FTF_SetFont(tstr, U.fontsize);
183
184                 sprintf(U.fontname, ".blender/.bfont.ttf\0");
185 #else
186                 sprintf(U.fontname, ".blender/.bfont.ttf\0");
187
188                 result = FTF_SetFont(U.fontname, U.fontsize);
189 #endif
190         }
191
192         if(result) {
193                 lang_setlanguage();
194
195                 G.ui_international = TRUE;
196         } else {
197                 printf("no font found for international support\n");
198                 G.ui_international = FALSE;
199                 U.transopts &= ~TR_ALL;
200                 U.fontsize = 0;
201         }
202
203         allqueue(REDRAWALL, 0);
204 }
205
206
207 char *first_dpointchar(char *string) {
208         char *dpointchar;
209         
210         dpointchar= strchr(string, ':');        
211
212         return dpointchar;
213 }
214
215
216 void splitlangline(char *line, LANGMenuEntry *lme)
217 {
218         char *dpointchar= first_dpointchar(line);
219
220         if (dpointchar) {
221                 lme->code= BLI_strdup(dpointchar+1);
222                 *(dpointchar)=0;
223                 lme->language= BLI_strdup(line);
224         } else {
225                 error("Invalid language file");
226         }
227 }
228
229
230 void puplang_insert_entry(char *line)
231 {
232         LANGMenuEntry *lme, *prev;
233         int sorted = 0;
234
235         prev= NULL;
236         lme= langmenu;
237
238         for (; lme; prev= lme, lme= lme->next) {
239                 if (lme->line) {
240                         if (BLI_streq(line, lme->line)) {
241                                 return;
242                         } else if (sorted && strcmp(line, lme->line)<0) {
243                                 break;
244                         }
245                 }
246         }
247         
248         lme= MEM_mallocN(sizeof(*lme), "lme");
249         lme->line = BLI_strdup(line);
250         splitlangline(line, lme);
251         lme->id = tot_lang;
252         tot_lang++;
253
254         if (prev) {
255                 lme->next= prev->next;
256                 prev->next= lme;
257         } else {
258                 lme->next= langmenu;
259                 langmenu= lme;
260         }
261 }
262
263
264 int read_languagefile(void) {
265         char name[FILE_MAXDIR+FILE_MAXFILE];
266         LinkNode *l, *lines;
267         
268         /* .Blanguages */
269         BLI_make_file_string("/", name, BLI_gethome(), ".Blanguages");
270
271         lines= BLI_read_file_as_lines(name);
272
273         if(lines == NULL) {
274                 /* If not found in home, try current dir 
275                  * (Resources folder of app bundle on OS X) */
276 #ifdef __APPLE__
277                 char *bundlePath = BLI_getbundle();
278                 strcpy(name, bundlePath);
279                 strcat(name, "/Contents/Resources/.Blanguages");
280 #else
281                 strcpy(name, ".blender/.Blanguages");
282 #endif
283                 lines= BLI_read_file_as_lines(name);
284
285                 if(lines == NULL) {
286                         /* If not found in .blender, try current dir */
287                         strcpy(name, ".Blanguages");
288                         lines= BLI_read_file_as_lines(name);
289                         if(lines == NULL) {
290                                 error("File \".Blanguages\" not found");
291                                 return 0;
292                         }
293                 }
294         }
295
296         for (l= lines; l; l= l->next) {
297                 char *line= l->link;
298                         
299                 if (!BLI_streq(line, "")) {
300                         puplang_insert_entry(line);
301                 }
302         }
303
304         BLI_free_file_lines(lines);
305
306         return 1;
307 }
308
309
310 void free_languagemenu(void)
311 {
312         LANGMenuEntry *lme= langmenu;
313
314         while (lme) {
315                 LANGMenuEntry *n= lme->next;
316
317                 if (lme->line) MEM_freeN(lme->line);
318                 if (lme->language) MEM_freeN(lme->language);
319                 if (lme->code) MEM_freeN(lme->code);
320                 MEM_freeN(lme);
321
322                 lme= n;
323         }
324 }
325
326 #endif /* INTERNATIONAL */