9c863da9ebaf96364358369b306fa6d6ddf39e0a
[blender.git] / source / blender / blenfont / intern / blf_translation.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2011 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation,
22  *                 Sergey Sharybin
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/blenfont/intern/blf_translation.c
28  *  \ingroup blf
29  */
30
31 #include <stdlib.h>
32 #include <string.h>
33
34 #ifdef WITH_INTERNATIONAL
35 #include <libintl.h>
36 #include <locale.h>
37
38 #define GETTEXT_CONTEXT_GLUE "\004"
39
40 /* needed for windows version of gettext */
41 #ifndef LC_MESSAGES
42 #  define LC_MESSAGES 1729
43 #endif
44
45 #endif
46
47 #include "MEM_guardedalloc.h"
48
49 #include "BLI_utildefines.h"
50 #include "BLI_path_util.h"
51 #include "BLI_string.h"
52 #include "BLI_path_util.h"
53 #include "BLI_fileops.h"
54
55 #include "BLF_translation.h"
56
57 #include "DNA_userdef_types.h" /* For user settings. */
58
59 #ifdef WITH_INTERNATIONAL
60 static const char unifont_filename[] = "droidsans.ttf.gz";
61 static unsigned char *unifont_ttf = NULL;
62 static int unifont_size = 0;
63
64 unsigned char *BLF_get_unifont(int *unifont_size_r)
65 {
66         if (unifont_ttf == NULL) {
67                 char *fontpath = BLI_get_folder(BLENDER_DATAFILES, "fonts");
68                 if (fontpath) {
69                         char unifont_path[1024];
70
71                         BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_filename);
72
73                         unifont_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_size);
74                 }
75                 else {
76                         printf("%s: 'fonts' data path not found for international font, continuing\n", __func__);
77                 }
78         }
79
80         *unifont_size_r = unifont_size;
81
82         return unifont_ttf;
83 }
84
85 void BLF_free_unifont(void)
86 {
87         if (unifont_ttf)
88                 MEM_freeN(unifont_ttf);
89 }
90
91 #endif
92
93 const char *BLF_gettext(const char *msgid)
94 {
95 #ifdef WITH_INTERNATIONAL
96         if (msgid && msgid[0])
97                 return gettext(msgid);
98         return "";
99 #else
100         return msgid;
101 #endif
102 }
103
104 const char *BLF_pgettext(const char *context, const char *message)
105 {
106 #ifdef WITH_INTERNATIONAL
107         char static_msg_ctxt_id[1024];
108         char *dynamic_msg_ctxt_id = NULL;
109         char *msg_ctxt_id;
110         const char *translation;
111
112         size_t overall_length = strlen(context) + strlen(message) + sizeof(GETTEXT_CONTEXT_GLUE) + 1;
113
114         if (!message || !context || !message[0])
115                 return "";
116
117         if (overall_length > sizeof(static_msg_ctxt_id)) {
118                 dynamic_msg_ctxt_id = malloc(overall_length);
119                 msg_ctxt_id = dynamic_msg_ctxt_id;
120         }
121         else {
122                 msg_ctxt_id = static_msg_ctxt_id;
123         }
124
125         sprintf(msg_ctxt_id, "%s%s%s", context, GETTEXT_CONTEXT_GLUE, message);
126
127         translation = (char *)dcgettext(TEXT_DOMAIN_NAME, msg_ctxt_id, LC_MESSAGES);
128
129         if (dynamic_msg_ctxt_id)
130                 free(dynamic_msg_ctxt_id);
131
132         if (translation == msg_ctxt_id)
133                 translation = message;
134
135         return translation;
136 #else
137         (void)context;
138         return message;
139 #endif
140 }
141
142 int BLF_translate_iface(void)
143 {
144 #ifdef WITH_INTERNATIONAL
145         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
146 #else
147         return 0;
148 #endif
149 }
150
151 int BLF_translate_tooltips(void)
152 {
153 #ifdef WITH_INTERNATIONAL
154         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
155 #else
156         return 0;
157 #endif
158 }
159
160 const char *BLF_translate_do_iface(const char *context, const char *msgid)
161 {
162 #ifdef WITH_INTERNATIONAL
163         if (BLF_translate_iface()) {
164                 if (context)
165                         return BLF_pgettext(context, msgid);
166                 else
167                         return BLF_gettext(msgid);
168         }
169         else
170                 return msgid;
171 #else
172         (void)context;
173         return msgid;
174 #endif
175 }
176
177 const char *BLF_translate_do_tooltip(const char *context, const char *msgid)
178 {
179 #ifdef WITH_INTERNATIONAL
180         if (BLF_translate_tooltips()) {
181                 if (context)
182                         return BLF_pgettext(context, msgid);
183                 else
184                         return BLF_gettext(msgid);
185         }
186         else
187                 return msgid;
188 #else
189         (void)context;
190         return msgid;
191 #endif
192 }