Blender V5.0
blt_translation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11
12#include <cstdlib>
13#include <cstring>
14#include <optional>
15
16#include "BLT_translation.hh"
17
18#include "DNA_userdef_types.h" /* For user settings. */
19
20#ifdef WITH_PYTHON
21# include "BPY_extern.hh"
22#endif
23
24#ifdef WITH_INTERNATIONAL
25# include "BLI_threads.h"
26# include "messages.hh"
27#endif /* WITH_INTERNATIONAL */
28
31
33{
34 /* We use the "short" test, a more complete one could be:
35 * return (!msgctxt || !msgctxt[0] || STREQ(msgctxt, BLT_I18NCONTEXT_DEFAULT_BPYRNA))
36 */
37 /* NOTE: trying without the void string check for now, it *should* not be necessary... */
38 return (msgctxt.is_empty() || msgctxt[0] == BLT_I18NCONTEXT_DEFAULT_BPYRNA[0]);
39}
40
41static std::optional<StringRefNull> pgettext(StringRef msgctxt, const StringRef msgid)
42{
43#ifdef WITH_INTERNATIONAL
44 if (msgid.is_empty()) {
45 return std::nullopt;
46 }
47 if (BLT_is_default_context(msgctxt)) {
49 }
50 if (const std::optional<StringRefNull> translation = blender::locale::translate(
51 0, msgctxt, msgid))
52 {
53 return translation;
54 }
55# ifdef WITH_PYTHON
56 return BPY_app_translations_py_pgettext(msgctxt, msgid);
57# endif
58#else
59 UNUSED_VARS(msgctxt, msgid);
60 return std::nullopt;
61#endif
62}
63
64const char *BLT_pgettext(const char *msgctxt, const char *msgid)
65{
66 const std::optional<StringRefNull> translation = pgettext(msgctxt, msgid);
67 if (!translation) {
68 return msgid;
69 }
70 return translation->c_str();
71}
72
74{
75 const std::optional<StringRefNull> translation = pgettext(msgctxt, msgid);
76 if (!translation) {
77 return msgid;
78 }
79 return *translation;
80}
81
83{
84#ifdef WITH_INTERNATIONAL
85 return BLI_thread_is_main();
86#else
87 return false;
88#endif
89}
90
92{
93#ifdef WITH_INTERNATIONAL
94 return BLT_translate() && (U.transopts & USER_TR_IFACE);
95#else
96 return false;
97#endif
98}
99
101{
102#ifdef WITH_INTERNATIONAL
103 return BLT_translate() && (U.transopts & USER_TR_TOOLTIPS);
104#else
105 return false;
106#endif
107}
108
110{
111#ifdef WITH_INTERNATIONAL
112 return BLT_translate() && (U.transopts & USER_TR_REPORTS);
113#else
114 return false;
115#endif
116}
117
119{
120#ifdef WITH_INTERNATIONAL
121 return BLT_translate() && (U.transopts & USER_TR_NEWDATANAME);
122#else
123 return false;
124#endif
125}
126
127template<typename StringT> StringT translate_do(StringT msgctxt, StringT msgid)
128{
129#ifdef WITH_INTERNATIONAL
130 if (BLT_translate()) {
131 return BLT_pgettext(msgctxt, msgid);
132 }
133
134 return msgid;
135
136#else
137 (void)msgctxt;
138 return msgid;
139#endif
140}
141
142const char *BLT_translate_do(const char *msgctxt, const char *msgid)
143{
144 return translate_do(msgctxt, msgid);
145}
146
148{
149 return translate_do(msgctxt, msgid);
150}
151
152template<typename StringT> StringT translate_do_iface(StringT msgctxt, StringT msgid)
153{
154#ifdef WITH_INTERNATIONAL
155 if (BLT_translate_iface()) {
156 return BLT_pgettext(msgctxt, msgid);
157 }
158
159 return msgid;
160
161#else
162 (void)msgctxt;
163 return msgid;
164#endif
165}
166
167const char *BLT_translate_do_iface(const char *msgctxt, const char *msgid)
168{
169 return translate_do_iface(msgctxt, msgid);
170}
171
173{
174 return translate_do_iface(msgctxt, msgid);
175}
176
177template<typename StringT> StringT translate_do_tooltip(StringT msgctxt, StringT msgid)
178{
179#ifdef WITH_INTERNATIONAL
181 return BLT_pgettext(msgctxt, msgid);
182 }
183
184 return msgid;
185
186#else
187 (void)msgctxt;
188 return msgid;
189#endif
190}
191
192const char *BLT_translate_do_tooltip(const char *msgctxt, const char *msgid)
193{
194 return translate_do_tooltip(msgctxt, msgid);
195}
196
198{
199 return translate_do_tooltip(msgctxt, msgid);
200}
201
202template<typename StringT> StringT translate_do_report(StringT msgctxt, StringT msgid)
203{
204#ifdef WITH_INTERNATIONAL
205 if (BLT_translate_reports()) {
206 return BLT_pgettext(msgctxt, msgid);
207 }
208
209 return msgid;
210
211#else
212 (void)msgctxt;
213 return msgid;
214#endif
215}
216
217const char *BLT_translate_do_report(const char *msgctxt, const char *msgid)
218{
219 return translate_do_report(msgctxt, msgid);
220}
221
223{
224 return translate_do_report(msgctxt, msgid);
225}
226
227template<typename StringT> StringT translate_do_new_dataname(StringT msgctxt, StringT msgid)
228{
229#ifdef WITH_INTERNATIONAL
231 return BLT_pgettext(msgctxt, msgid);
232 }
233
234 return msgid;
235
236#else
237 (void)msgctxt;
238 return msgid;
239#endif
240}
241
242const char *BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid)
243{
244 return translate_do_new_dataname(msgctxt, msgid);
245}
246
248{
249 return translate_do_new_dataname(msgctxt, msgid);
250}
int BLI_thread_is_main(void)
Definition threads.cc:179
#define UNUSED_VARS(...)
#define BLT_I18NCONTEXT_DEFAULT
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
@ USER_TR_REPORTS
@ USER_TR_NEWDATANAME
@ USER_TR_TOOLTIPS
@ USER_TR_IFACE
#define U
const char * BLT_translate_do(const char *msgctxt, const char *msgid)
bool BLT_translate_iface()
StringT translate_do_tooltip(StringT msgctxt, StringT msgid)
StringT translate_do(StringT msgctxt, StringT msgid)
bool BLT_translate_new_dataname()
StringT translate_do_new_dataname(StringT msgctxt, StringT msgid)
bool BLT_is_default_context(const StringRef msgctxt)
StringT translate_do_report(StringT msgctxt, StringT msgid)
const char * BLT_pgettext(const char *msgctxt, const char *msgid)
bool BLT_translate_reports()
const char * BLT_translate_do_tooltip(const char *msgctxt, const char *msgid)
static std::optional< StringRefNull > pgettext(StringRef msgctxt, const StringRef msgid)
bool BLT_translate()
bool BLT_translate_tooltips()
const char * BLT_translate_do_iface(const char *msgctxt, const char *msgid)
StringT translate_do_iface(StringT msgctxt, StringT msgid)
const char * BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid)
const char * BLT_translate_do_report(const char *msgctxt, const char *msgid)
constexpr bool is_empty() const
std::optional< StringRefNull > translate(const int domain, const StringRef context, const StringRef key)
Definition messages.cc:620