Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!
[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 #ifdef WITH_INTERNATIONAL
37
38 #include "boost_locale_wrapper.h"
39
40 #include "MEM_guardedalloc.h"
41
42 #include "BLI_utildefines.h"
43 #include "BLI_path_util.h"
44 #include "BLI_string.h"
45 #include "BLI_path_util.h"
46 #include "BLI_fileops.h"
47
48 #include "DNA_userdef_types.h" /* For user settings. */
49
50 #include "BPY_extern.h"
51
52 static const char unifont_filename[] = "droidsans.ttf.gz";
53 static unsigned char *unifont_ttf = NULL;
54 static int unifont_size = 0;
55
56 unsigned char *BLF_get_unifont(int *unifont_size_r)
57 {
58         if (unifont_ttf == NULL) {
59                 char *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 }
76
77 void BLF_free_unifont(void)
78 {
79         if (unifont_ttf)
80                 MEM_freeN(unifont_ttf);
81 }
82
83 #endif
84
85 const char *BLF_pgettext(const char *msgctxt, const char *msgid)
86 {
87 #ifdef WITH_INTERNATIONAL
88         if (msgid && msgid[0]) {
89                 const char *ret = bl_locale_pgettext(msgctxt, msgid);
90                 /* We assume if the returned string is the same (memory level) as the msgid, no translation was found,
91                  * and we can try py scripts' ones!
92                  */
93                 if (ret == msgid) {
94                         ret = BPY_app_translations_py_pgettext(msgctxt, msgid);
95                 }
96
97                 return ret;
98         }
99         return "";
100 #else
101         (void)msgctxt;
102         return msgid;
103 #endif
104 }
105
106 int BLF_translate_iface(void)
107 {
108 #ifdef WITH_INTERNATIONAL
109         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
110 #else
111         return 0;
112 #endif
113 }
114
115 int BLF_translate_tooltips(void)
116 {
117 #ifdef WITH_INTERNATIONAL
118         return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
119 #else
120         return 0;
121 #endif
122 }
123
124 const char *BLF_translate_do_iface(const char *msgctxt, const char *msgid)
125 {
126 #ifdef WITH_INTERNATIONAL
127         if (BLF_translate_iface()) {
128                 return BLF_pgettext(msgctxt, msgid);
129         }
130         else {
131                 return msgid;
132         }
133 #else
134         (void)msgctxt;
135         return msgid;
136 #endif
137 }
138
139 const char *BLF_translate_do_tooltip(const char *msgctxt, const char *msgid)
140 {
141 #ifdef WITH_INTERNATIONAL
142         if (BLF_translate_tooltips()) {
143                 return BLF_pgettext(msgctxt, msgid);
144         }
145         else {
146                 return msgid;
147         }
148 #else
149         (void)msgctxt;
150         return msgid;
151 #endif
152 }