i18n stuff: adds translation_context to RNA structs (used for there ui name), and...
[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[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 (overall_length > sizeof(static_msg_ctxt_id)) {
115                 dynamic_msg_ctxt_id = malloc(overall_length);
116                 msg_ctxt_id = dynamic_msg_ctxt_id;
117         }
118         else {
119                 msg_ctxt_id = static_msg_ctxt_id;
120         }
121
122         sprintf(msg_ctxt_id, "%s%s%s", context, GETTEXT_CONTEXT_GLUE, message);
123
124         translation = (char*)dcgettext(TEXT_DOMAIN_NAME, msg_ctxt_id, LC_MESSAGES);
125
126         if (dynamic_msg_ctxt_id)
127                 free(dynamic_msg_ctxt_id);
128
129         if (translation == msg_ctxt_id)
130                 translation = message;
131
132         return translation;
133 #else
134         (void)context;
135         return message;
136 #endif
137 }
138
139 int BLF_translate_iface(void)
140 {
141 #ifdef WITH_INTERNATIONAL
142         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
143 #else
144         return 0;
145 #endif
146 }
147
148 int BLF_translate_tooltips(void)
149 {
150 #ifdef WITH_INTERNATIONAL
151         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
152 #else
153         return 0;
154 #endif
155 }
156
157 const char *BLF_translate_do_iface(const char *context, const char *msgid)
158 {
159 #ifdef WITH_INTERNATIONAL
160         if(BLF_translate_iface()) {
161                 if (context)
162                         return BLF_pgettext(context, msgid);
163                 else
164                         return BLF_gettext(msgid);
165         }
166         else
167                 return msgid;
168 #else
169         return msgid;
170 #endif
171 }
172
173 const char *BLF_translate_do_tooltip(const char *context, const char *msgid)
174 {
175 #ifdef WITH_INTERNATIONAL
176         if(BLF_translate_tooltips()) {
177                 if (context)
178                         return BLF_pgettext(context, msgid);
179                 else
180                         return BLF_gettext(msgid);
181         }
182         else
183                 return msgid;
184 #else
185         return msgid;
186 #endif
187 }