patch [#34103]
[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 #include "BLF_translation.h"
35
36 #include "MEM_guardedalloc.h"
37
38 #include "BLI_fileops.h"
39 #include "BLI_path_util.h"
40 #include "BLI_string.h"
41
42 #include "DNA_userdef_types.h" /* For user settings. */
43
44 #include "BPY_extern.h"
45
46 #ifdef WITH_INTERNATIONAL
47
48 #include "boost_locale_wrapper.h"
49
50 static const char unifont_filename[] = "droidsans.ttf.gz";
51 static unsigned char *unifont_ttf = NULL;
52 static int unifont_size = 0;
53 #endif  /* WITH_INTERNATIONAL */
54
55 unsigned char *BLF_get_unifont(int *unifont_size_r)
56 {
57 #ifdef WITH_INTERNATIONAL
58         if (unifont_ttf == NULL) {
59                 const char * const fontpath = BLI_get_folder(BLENDER_DATAFILES, "fonts");
60                 if (fontpath) {
61                         char unifont_path[1024];
62
63                         BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_filename);
64
65                         unifont_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_size);
66                 }
67                 else {
68                         printf("%s: 'fonts' data path not found for international font, continuing\n", __func__);
69                 }
70         }
71
72         *unifont_size_r = unifont_size;
73
74         return unifont_ttf;
75 #else
76         (void)unifont_size_r;
77         return NULL;
78 #endif
79 }
80
81 void BLF_free_unifont(void)
82 {
83 #ifdef WITH_INTERNATIONAL
84         if (unifont_ttf)
85                 MEM_freeN(unifont_ttf);
86 #else
87 #endif
88 }
89
90 const char *BLF_pgettext(const char *msgctxt, const char *msgid)
91 {
92 #ifdef WITH_INTERNATIONAL
93         if (msgid && msgid[0]) {
94                 const char *ret;
95
96                 /*if (msgctxt && !strcmp(msgctxt, BLF_I18NCONTEXT_DEFAULT_BPY_INTERN)) { */
97                 if (msgctxt && msgctxt[0] == BLF_I18NCONTEXT_DEFAULT_BPY[0]) {
98                         /* BLF_I18NCONTEXT_DEFAULT_BPY context is reserved and considered the same as default NULL one. */
99                         msgctxt = BLF_I18NCONTEXT_DEFAULT;
100                 }
101                 ret = bl_locale_pgettext(msgctxt, msgid);
102                 /* We assume if the returned string is the same (memory level) as the msgid, no translation was found,
103                  * and we can try py scripts' ones!
104                  */
105                 if (ret == msgid) {
106                         ret = BPY_app_translations_py_pgettext(msgctxt, msgid);
107                 }
108
109                 return ret;
110         }
111         return "";
112 #else
113         (void)msgctxt;
114         return msgid;
115 #endif
116 }
117
118 bool BLF_translate_iface(void)
119 {
120 #ifdef WITH_INTERNATIONAL
121         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
122 #else
123         return false;
124 #endif
125 }
126
127 bool BLF_translate_tooltips(void)
128 {
129 #ifdef WITH_INTERNATIONAL
130         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
131 #else
132         return false;
133 #endif
134 }
135
136 const char *BLF_translate_do_iface(const char *msgctxt, const char *msgid)
137 {
138 #ifdef WITH_INTERNATIONAL
139         if (BLF_translate_iface()) {
140                 return BLF_pgettext(msgctxt, msgid);
141         }
142         else {
143                 return msgid;
144         }
145 #else
146         (void)msgctxt;
147         return msgid;
148 #endif
149 }
150
151 const char *BLF_translate_do_tooltip(const char *msgctxt, const char *msgid)
152 {
153 #ifdef WITH_INTERNATIONAL
154         if (BLF_translate_tooltips()) {
155                 return BLF_pgettext(msgctxt, msgid);
156         }
157         else {
158                 return msgid;
159         }
160 #else
161         (void)msgctxt;
162         return msgid;
163 #endif
164 }