diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-08-16 10:32:01 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-08-18 00:01:26 +0300 |
commit | 2e2dc9b9e32d104a0f7c3241ea0c11b57a37fd5b (patch) | |
tree | a6830032130d13dcbfa522ed6889fe6f141f99f3 /source/blender/blenfont | |
parent | 3047b96eaa962fe45d2333f5ea4be809e02787cd (diff) |
Refactor translation code out of blenfont
- Add blentranslation `BLT_*` module.
- moved & split `BLF_translation.h` into (`BLT_translation.h`, `BLT_lang.h`).
- moved `BLF_*_unifont` functions from `blf_translation.c` to new source file `blf_font_i18n.c`.
Diffstat (limited to 'source/blender/blenfont')
-rw-r--r-- | source/blender/blenfont/BLF_api.h | 6 | ||||
-rw-r--r-- | source/blender/blenfont/BLF_translation.h | 240 | ||||
-rw-r--r-- | source/blender/blenfont/CMakeLists.txt | 6 | ||||
-rw-r--r-- | source/blender/blenfont/SConscript | 2 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_font_i18n.c | 123 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_lang.c | 354 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_thumbs.c | 4 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_translation.c | 265 |
8 files changed, 134 insertions, 866 deletions
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index 09734bd9754..d8dee7110a5 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -192,6 +192,12 @@ void BLF_thumb_preview( const float font_color[4], const int font_size, unsigned char *buf, int w, int h, int channels) ATTR_NONNULL(); +/* blf_font_i18.c */ +unsigned char *BLF_get_unifont(int *unifont_size); +void BLF_free_unifont(void); +unsigned char *BLF_get_unifont_mono(int *unifont_size); +void BLF_free_unifont_mono(void); + #ifdef DEBUG void BLF_state_print(int fontid); #endif diff --git a/source/blender/blenfont/BLF_translation.h b/source/blender/blenfont/BLF_translation.h deleted file mode 100644 index c9b0c253ed4..00000000000 --- a/source/blender/blenfont/BLF_translation.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2011 Blender Foundation. - * All rights reserved. - * - * - * Contributor(s): Blender Foundation, - * Sergey Sharybin - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/blenfont/BLF_translation.h - * \ingroup blf - */ - - -#ifndef __BLF_TRANSLATION_H__ -#define __BLF_TRANSLATION_H__ - -#include "BLI_utildefines.h" /* for bool type */ - -#define TEXT_DOMAIN_NAME "blender" - -#ifdef __cplusplus -extern "C" { -#endif - -/* blf_lang.c */ - -/* Search the path directory to the locale files, this try all - * the case for Linux, Win and Mac. - * Also dynamically builds locales and locales' menu from "languages" text file. - */ -void BLF_lang_init(void); - -/* Free languages and locales_menu arrays created by BLF_lang_init. */ -void BLF_lang_free(void); - -/* Set the current locale. */ -void BLF_lang_set(const char *); -/* Get the current locale ([partial] ISO code, e.g. es_ES). */ -const char *BLF_lang_get(void); - -/* Get locale's elements (if relevant pointer is not NULL and element actually exists, e.g. if there is no variant, - * *variant and *language_variant will always be NULL). - * Non-null elements are always MEM_mallocN'ed, it's the caller's responsibility to free them. - * NOTE: Always available, even in non-WITH_INTERNATIONAL builds. - */ -void BLF_locale_explode(const char *locale, char **language, char **country, char **variant, - char **language_country, char **language_variant); - -/* Get EnumPropertyItem's for translations menu. */ -struct EnumPropertyItem *BLF_RNA_lang_enum_properties(void); - -/* blf_translation.c */ - -unsigned char *BLF_get_unifont(int *unifont_size); -void BLF_free_unifont(void); -unsigned char *BLF_get_unifont_mono(int *unifont_size); -void BLF_free_unifont_mono(void); - -bool BLF_is_default_context(const char *msgctxt); -const char *BLF_pgettext(const char *msgctxt, const char *msgid); - -/* translation */ -bool BLF_translate(void); -bool BLF_translate_iface(void); -bool BLF_translate_tooltips(void); -bool BLF_translate_new_dataname(void); -const char *BLF_translate_do(const char *msgctxt, const char *msgid); -const char *BLF_translate_do_iface(const char *msgctxt, const char *msgid); -const char *BLF_translate_do_tooltip(const char *msgctxt, const char *msgid); -const char *BLF_translate_do_new_dataname(const char *msgctxt, const char *msgid); - - -/* The "translation-marker" macro. */ -#define N_(msgid) msgid -#define CTX_N_(context, msgid) msgid - -/* Those macros should be used everywhere in UI code. */ -#ifdef WITH_INTERNATIONAL -/*# define _(msgid) BLF_gettext(msgid) */ -# define IFACE_(msgid) BLF_translate_do_iface(NULL, msgid) -# define TIP_(msgid) BLF_translate_do_tooltip(NULL, msgid) -# define DATA_(msgid) BLF_translate_do_new_dataname(NULL, msgid) -# define CTX_IFACE_(context, msgid) BLF_translate_do_iface(context, msgid) -# define CTX_TIP_(context, msgid) BLF_translate_do_tooltip(context, msgid) -# define CTX_DATA_(context, msgid) BLF_translate_do_new_dataname(context, msgid) -#else -/*# define _(msgid) msgid */ -# define IFACE_(msgid) msgid -# define TIP_(msgid) msgid -# define DATA_(msgid) msgid -# define CTX_IFACE_(context, msgid) msgid -# define CTX_TIP_(context, msgid) msgid -# define CTX_DATA_(context, msgid) msgid -#endif - -/* Helper macro, when we want to define a same msgid for multiple msgctxt... - * Does nothing in C, but is "parsed" by our i18n py tools. - * XXX Currently limited to at most 16 contexts at once - * (but you can call it several times with the same msgid, should you need more contexts!). - */ -#define BLF_I18N_MSGID_MULTI_CTXT(msgid, ...) - -/****************************************************************************** - * All i18n contexts must be defined here. - * This is a nice way to be sure not to use a context twice for different - * things, and limit the number of existing contexts! - * WARNING! Contexts should not be longer than BKE_ST_MAXNAME - 1! - */ - -/* Default, void context. - * WARNING! The "" context is not the same as no (NULL) context at mo/boost::locale level! - * NOTE: We translate BLF_I18NCONTEXT_DEFAULT as BLF_I18NCONTEXT_DEFAULT_BPY in Python, as we can't use "natural" - * None value in rna string properties... :/ - * The void string "" is also interpreted as BLF_I18NCONTEXT_DEFAULT. - * For perf reason, we only use the first char to detect this context, so other contexts should never start - * with the same char! - */ -#define BLF_I18NCONTEXT_DEFAULT NULL -#define BLF_I18NCONTEXT_DEFAULT_BPYRNA "*" - -/* Default context for operator names/labels. */ -#define BLF_I18NCONTEXT_OPERATOR_DEFAULT "Operator" - -/* Mark the msgid applies to several elements (needed in some cases, as english adjectives have no plural mark. :( */ -#define BLF_I18NCONTEXT_PLURAL "Plural" - -/* ID-types contexts. */ -/* WARNING! Keep it in sync with idtypes in blenkernel/intern/idcode.c */ -#define BLF_I18NCONTEXT_ID_ACTION "Action" -#define BLF_I18NCONTEXT_ID_ARMATURE "Armature" -#define BLF_I18NCONTEXT_ID_BRUSH "Brush" -#define BLF_I18NCONTEXT_ID_CAMERA "Camera" -#define BLF_I18NCONTEXT_ID_CURVE "Curve" -#define BLF_I18NCONTEXT_ID_FREESTYLELINESTYLE "FreestyleLineStyle" -#define BLF_I18NCONTEXT_ID_GPENCIL "GPencil" -#define BLF_I18NCONTEXT_ID_GROUP "Group" -#define BLF_I18NCONTEXT_ID_ID "ID" -#define BLF_I18NCONTEXT_ID_IMAGE "Image" -/*#define BLF_I18NCONTEXT_ID_IPO "Ipo"*/ /* Deprecated */ -#define BLF_I18NCONTEXT_ID_SHAPEKEY "Key" -#define BLF_I18NCONTEXT_ID_LAMP "Lamp" -#define BLF_I18NCONTEXT_ID_LIBRARY "Library" -#define BLF_I18NCONTEXT_ID_LATTICE "Lattice" -#define BLF_I18NCONTEXT_ID_MATERIAL "Material" -#define BLF_I18NCONTEXT_ID_METABALL "Metaball" -#define BLF_I18NCONTEXT_ID_MESH "Mesh" -#define BLF_I18NCONTEXT_ID_NODETREE "NodeTree" -#define BLF_I18NCONTEXT_ID_OBJECT "Object" -#define BLF_I18NCONTEXT_ID_PAINTCURVE "PaintCurve" -#define BLF_I18NCONTEXT_ID_PALETTE "Palette" -#define BLF_I18NCONTEXT_ID_PARTICLESETTINGS "ParticleSettings" -#define BLF_I18NCONTEXT_ID_SCENE "Scene" -#define BLF_I18NCONTEXT_ID_SCREEN "Screen" -#define BLF_I18NCONTEXT_ID_SEQUENCE "Sequence" -#define BLF_I18NCONTEXT_ID_SPEAKER "Speaker" -#define BLF_I18NCONTEXT_ID_SOUND "Sound" -#define BLF_I18NCONTEXT_ID_TEXTURE "Texture" -#define BLF_I18NCONTEXT_ID_TEXT "Text" -#define BLF_I18NCONTEXT_ID_VFONT "VFont" -#define BLF_I18NCONTEXT_ID_WORLD "World" -#define BLF_I18NCONTEXT_ID_WINDOWMANAGER "WindowManager" -#define BLF_I18NCONTEXT_ID_MOVIECLIP "MovieClip" -#define BLF_I18NCONTEXT_ID_MASK "Mask" - -/* Helper for bpy.app.i18n object... */ -typedef struct { - const char *c_id; - const char *py_id; - const char *value; -} BLF_i18n_contexts_descriptor; - -#define BLF_I18NCONTEXTS_ITEM(ctxt_id, py_id) {#ctxt_id, py_id, ctxt_id} - -#define BLF_I18NCONTEXTS_DESC { \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_DEFAULT, "default_real"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_DEFAULT_BPYRNA, "default"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "operator_default"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_PLURAL, "plural"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ACTION, "id_action"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ARMATURE, "id_armature"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_BRUSH, "id_brush"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_CAMERA, "id_camera"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_CURVE, "id_curve"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_FREESTYLELINESTYLE, "id_fs_linestyle"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_GPENCIL, "id_gpencil"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_GROUP, "id_group"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ID, "id_id"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_IMAGE, "id_image"), \ - /*BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_IPO, "id_ipo"),*/ \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SHAPEKEY, "id_shapekey"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LAMP, "id_lamp"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LIBRARY, "id_library"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LATTICE, "id_lattice"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MASK, "id_mask"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MATERIAL, "id_material"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_METABALL, "id_metaball"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MESH, "id_mesh"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MOVIECLIP, "id_movieclip"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_NODETREE, "id_nodetree"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_OBJECT, "id_object"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_PAINTCURVE, "id_paintcurve"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_PALETTE, "id_palette"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_PARTICLESETTINGS, "id_particlesettings"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SCENE, "id_scene"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SCREEN, "id_screen"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SEQUENCE, "id_sequence"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SPEAKER, "id_speaker"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SOUND, "id_sound"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_TEXTURE, "id_texture"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_TEXT, "id_text"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_VFONT, "id_vfont"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_WORLD, "id_world"), \ - BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_WINDOWMANAGER, "id_windowmanager"), \ - {NULL, NULL, NULL} \ -} - -#ifdef __cplusplus -}; -#endif - -#endif /* __BLF_TRANSLATION_H__ */ diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt index 059e2cac680..36ad6fe03cf 100644 --- a/source/blender/blenfont/CMakeLists.txt +++ b/source/blender/blenfont/CMakeLists.txt @@ -25,6 +25,7 @@ set(INC . ../blenkernel ../blenlib + ../blentranslation ../editors/include ../gpu ../makesdna @@ -32,7 +33,6 @@ set(INC ../imbuf ../../../intern/guardedalloc ../../../intern/glew-mx - ../../../intern/locale ) set(INC_SYS @@ -44,14 +44,12 @@ set(SRC intern/blf.c intern/blf_dir.c intern/blf_font.c + intern/blf_font_i18n.c intern/blf_glyph.c - intern/blf_lang.c intern/blf_thumbs.c - intern/blf_translation.c intern/blf_util.c BLF_api.h - BLF_translation.h intern/blf_internal.h intern/blf_internal_types.h ) diff --git a/source/blender/blenfont/SConscript b/source/blender/blenfont/SConscript index fdb5f669597..6c3b5748011 100644 --- a/source/blender/blenfont/SConscript +++ b/source/blender/blenfont/SConscript @@ -34,11 +34,11 @@ incs = [ '.', 'intern', '#/intern/guardedalloc', - '#/intern/locale', env['BF_GLEW_INC'], '#/intern/glew-mx', '../blenkernel', '../blenlib', + '../blentranslation', '../editors/include', '../gpu', '../imbuf', diff --git a/source/blender/blenfont/intern/blf_font_i18n.c b/source/blender/blenfont/intern/blf_font_i18n.c new file mode 100644 index 00000000000..da7d2adcdf6 --- /dev/null +++ b/source/blender/blenfont/intern/blf_font_i18n.c @@ -0,0 +1,123 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 Blender Foundation. + * All rights reserved. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenfont/intern/blf_font_access.c + * \ingroup blf + * + * API for accessing font files. + */ + +#include <stdlib.h> +#include <string.h> + +#include "BLF_api.h" + +#include "MEM_guardedalloc.h" + +#include "BLI_fileops.h" +#include "BLI_path_util.h" +#include "BLI_string.h" + +#include "BKE_appdir.h" + +#ifdef WITH_INTERNATIONAL +static const char unifont_filename[] = "droidsans.ttf.gz"; +static unsigned char *unifont_ttf = NULL; +static int unifont_size = 0; +static const char unifont_mono_filename[] = "bmonofont-i18n.ttf.gz"; +static unsigned char *unifont_mono_ttf = NULL; +static int unifont_mono_size = 0; +#endif /* WITH_INTERNATIONAL */ + +unsigned char *BLF_get_unifont(int *r_unifont_size) +{ +#ifdef WITH_INTERNATIONAL + if (unifont_ttf == NULL) { + const char * const fontpath = BKE_appdir_folder_id(BLENDER_DATAFILES, "fonts"); + if (fontpath) { + char unifont_path[1024]; + + BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_filename); + + unifont_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_size); + } + else { + printf("%s: 'fonts' data path not found for international font, continuing\n", __func__); + } + } + + *r_unifont_size = unifont_size; + + return unifont_ttf; +#else + (void)r_unifont_size; + return NULL; +#endif +} + +void BLF_free_unifont(void) +{ +#ifdef WITH_INTERNATIONAL + if (unifont_ttf) + MEM_freeN(unifont_ttf); +#else +#endif +} + +unsigned char *BLF_get_unifont_mono(int *r_unifont_size) +{ +#ifdef WITH_INTERNATIONAL + if (unifont_mono_ttf == NULL) { + const char *fontpath = BKE_appdir_folder_id(BLENDER_DATAFILES, "fonts"); + if (fontpath) { + char unifont_path[1024]; + + BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_mono_filename); + + unifont_mono_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_mono_size); + } + else { + printf("%s: 'fonts' data path not found for international monospace font, continuing\n", __func__); + } + } + + *r_unifont_size = unifont_mono_size; + + return unifont_mono_ttf; +#else + (void)r_unifont_size; + return NULL; +#endif +} + +void BLF_free_unifont_mono(void) +{ +#ifdef WITH_INTERNATIONAL + if (unifont_mono_ttf) + MEM_freeN(unifont_mono_ttf); +#else +#endif +} diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c deleted file mode 100644 index 4683081a1ed..00000000000 --- a/source/blender/blenfont/intern/blf_lang.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2008 Blender Foundation. - * All rights reserved. - * - * Contributor(s): Blender Foundation. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/blenfont/intern/blf_lang.c - * \ingroup blf - * - * Main internationalization functions to set the locale and query available languages. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifndef _WIN32 -# include <locale.h> -#endif - -#include "RNA_types.h" - -#include "BLF_translation.h" /* own include */ - -#include "BLI_fileops.h" -#include "BLI_linklist.h" -#include "BLI_path_util.h" -#include "BLI_string.h" - -#include "BKE_appdir.h" - -#include "DNA_userdef_types.h" - -#include "MEM_guardedalloc.h" - -#ifdef WITH_INTERNATIONAL - -#include "boost_locale_wrapper.h" - -/* Locale options. */ -static const char **locales = NULL; -static int num_locales = 0; -static EnumPropertyItem *locales_menu = NULL; -static int num_locales_menu = 0; - -static void free_locales(void) -{ - if (locales) { - int idx = num_locales_menu - 1; /* Last item does not need to be freed! */ - while (idx--) { - MEM_freeN((void *)locales_menu[idx].identifier); - MEM_freeN((void *)locales_menu[idx].name); - MEM_freeN((void *)locales_menu[idx].description); /* Also frees locales's relevant value! */ - } - - MEM_freeN((void *)locales); - locales = NULL; - } - if (locales_menu) { - MEM_freeN(locales_menu); - locales_menu = NULL; - } - num_locales = num_locales_menu = 0; -} - -static void fill_locales(void) -{ - const char * const languages_path = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale"); - char languages[FILE_MAX]; - LinkNode *lines = NULL, *line; - char *str; - int idx = 0; - - free_locales(); - - BLI_join_dirfile(languages, FILE_MAX, languages_path, "languages"); - line = lines = BLI_file_read_as_lines(languages); - - /* This whole "parsing" code is a bit weak, in that it expects strictly formated input file... - * Should not be a problem, though, as this file is script-generated! */ - - /* First loop to find highest locale ID */ - while (line) { - int t; - str = (char *)line->link; - if (str[0] == '#' || str[0] == '\0') { - line = line->next; - continue; /* Comment or void... */ - } - t = atoi(str); - if (t >= num_locales) - num_locales = t + 1; - num_locales_menu++; - line = line->next; - } - num_locales_menu++; /* The "closing" void item... */ - - /* And now, build locales and locale_menu! */ - locales_menu = MEM_callocN(num_locales_menu * sizeof(EnumPropertyItem), __func__); - line = lines; - /* Do not allocate locales with zero-sized mem, as LOCALE macro uses NULL locales as invalid marker! */ - if (num_locales > 0) { - locales = MEM_callocN(num_locales * sizeof(char *), __func__); - while (line) { - int id; - char *loc, *sep1, *sep2, *sep3; - - str = (char *)line->link; - if (str[0] == '#' || str[0] == '\0') { - line = line->next; - continue; - } - - id = atoi(str); - sep1 = strchr(str, ':'); - if (sep1) { - sep1++; - sep2 = strchr(sep1, ':'); - if (sep2) { - locales_menu[idx].value = id; - locales_menu[idx].icon = 0; - locales_menu[idx].name = BLI_strdupn(sep1, sep2 - sep1); - - sep2++; - sep3 = strchr(sep2, ':'); - - if (sep3) { - locales_menu[idx].identifier = loc = BLI_strdupn(sep2, sep3 - sep2); - } - else { - locales_menu[idx].identifier = loc = BLI_strdup(sep2); - } - - if (id == 0) { - /* The DEFAULT item... */ - if (BLI_strnlen(loc, 2)) { - locales[id] = locales_menu[idx].description = BLI_strdup(""); - } - /* Menu "label", not to be stored in locales! */ - else { - locales_menu[idx].description = BLI_strdup(""); - } - } - else { - locales[id] = locales_menu[idx].description = BLI_strdup(loc); - } - idx++; - } - } - - line = line->next; - } - } - - /* Add closing item to menu! */ - locales_menu[idx].identifier = NULL; - locales_menu[idx].value = locales_menu[idx].icon = 0; - locales_menu[idx].name = locales_menu[idx].description = ""; - - BLI_file_free_lines(lines); -} -#endif /* WITH_INTERNATIONAL */ - -EnumPropertyItem *BLF_RNA_lang_enum_properties(void) -{ -#ifdef WITH_INTERNATIONAL - return locales_menu; -#else - return NULL; -#endif -} - -void BLF_lang_init(void) -{ -#ifdef WITH_INTERNATIONAL - const char * const messagepath = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale"); -#endif - - /* Make sure LANG is correct and wouldn't cause std::rumtime_error. */ -#ifndef _WIN32 - /* TODO(sergey): This code only ensures LANG is set properly, so later when - * Cycles will try to use file system API from boost there'll be no runtime - * exception generated by std::locale() which _requires_ having proper LANG - * set in the environment. - * - * Ideally we also need to ensure LC_ALL, LC_MESSAGES and others are also - * set to a proper value, but currently it's not a huge deal and doesn't - * cause any headache. - * - * Would also be good to find nicer way to check if LANG is correct. - */ - const char *lang = getenv("LANG"); - if (lang != NULL) { - char *old_locale = setlocale(LC_ALL, NULL); - /* Make a copy so subsequenct setlocale() doesn't interfere. */ - old_locale = BLI_strdup(old_locale); - if (setlocale(LC_ALL, lang) == NULL) { - setenv("LANG", "C", 1); - printf("Warning: Falling back to the standard locale (\"C\")\n"); - } - setlocale(LC_ALL, old_locale); - MEM_freeN(old_locale); - } -#endif - -#ifdef WITH_INTERNATIONAL - if (messagepath) { - bl_locale_init(messagepath, TEXT_DOMAIN_NAME); - fill_locales(); - } - else { - printf("%s: 'locale' data path for translations not found, continuing\n", __func__); - } -#else -#endif -} - -void BLF_lang_free(void) -{ -#ifdef WITH_INTERNATIONAL - free_locales(); -#else -#endif -} - -#ifdef WITH_INTERNATIONAL -# define ULANGUAGE ((U.language >= 0 && U.language < num_locales) ? U.language : 0) -# define LOCALE(_id) (locales ? locales[(_id)] : "") -#endif - -void BLF_lang_set(const char *str) -{ -#ifdef WITH_INTERNATIONAL - int ulang = ULANGUAGE; - const char *short_locale = str ? str : LOCALE(ulang); - const char *short_locale_utf8 = NULL; - - if ((U.transopts & USER_DOTRANSLATE) == 0) - return; - - /* We want to avoid locales like '.UTF-8'! */ - if (short_locale[0]) { - /* Hurrey! encoding needs to be placed *before* variant! */ - char *variant = strchr(short_locale, '@'); - if (variant) { - char *locale = BLI_strdupn(short_locale, variant - short_locale); - short_locale_utf8 = BLI_sprintfN("%s.UTF-8%s", locale, variant); - MEM_freeN(locale); - } - else { - short_locale_utf8 = BLI_sprintfN("%s.UTF-8", short_locale); - } - bl_locale_set(short_locale_utf8); - MEM_freeN((void *)short_locale_utf8); - } - else { - bl_locale_set(short_locale); - } -#else - (void)str; -#endif -} - -/* Get the current locale (short code, e.g. es_ES). */ -const char *BLF_lang_get(void) -{ -#ifdef WITH_INTERNATIONAL - if (BLF_translate()) { - const char *locale = LOCALE(ULANGUAGE); - if (locale[0] == '\0') { - /* Default locale, we have to find which one we are actually using! */ - locale = bl_locale_get(); - } - return locale; - } - return "en_US"; /* Kind of default locale in Blender when no translation enabled. */ -#else - return ""; -#endif -} - -#undef LOCALE -#undef ULANGUAGE - -/* Get locale's elements (if relevant pointer is not NULL and element actually exists, e.g. if there is no variant, - * *variant and *language_variant will always be NULL). - * Non-null elements are always MEM_mallocN'ed, it's the caller's responsibility to free them. - * NOTE: Keep that one always available, you never know, may become useful even in no-WITH_INTERNATIONAL context... - */ -void BLF_locale_explode(const char *locale, char **language, char **country, char **variant, - char **language_country, char **language_variant) -{ - char *m1, *m2, *_t = NULL; - - m1 = strchr(locale, '_'); - m2 = strchr(locale, '@'); - - if (language || language_variant) { - if (m1 || m2) { - _t = m1 ? BLI_strdupn(locale, m1 - locale) : BLI_strdupn(locale, m2 - locale); - if (language) - *language = _t; - } - else if (language) { - *language = BLI_strdup(locale); - } - } - if (country) { - if (m1) - *country = m2 ? BLI_strdupn(m1 + 1, m2 - (m1 + 1)) : BLI_strdup(m1 + 1); - else - *country = NULL; - } - if (variant) { - if (m2) - *variant = BLI_strdup(m2 + 1); - else - *variant = NULL; - } - if (language_country) { - if (m1) - *language_country = m2 ? BLI_strdupn(locale, m2 - locale) : BLI_strdup(locale); - else - *language_country = NULL; - } - if (language_variant) { - if (m2) - *language_variant = m1 ? BLI_strdupcat(_t, m2) : BLI_strdup(locale); - else - *language_variant = NULL; - } - if (_t && !language) { - MEM_freeN(_t); - } -} diff --git a/source/blender/blenfont/intern/blf_thumbs.c b/source/blender/blenfont/intern/blf_thumbs.c index 4b7a568b8b0..4eea5d581d0 100644 --- a/source/blender/blenfont/intern/blf_thumbs.c +++ b/source/blender/blenfont/intern/blf_thumbs.c @@ -45,7 +45,7 @@ #include "blf_internal_types.h" #include "BLF_api.h" -#include "BLF_translation.h" +#include "BLT_translation.h" #include "BLI_strict_flags.h" @@ -90,7 +90,7 @@ void BLF_thumb_preview( font_size_curr = font_size; for (i = 0; i < draw_str_lines; i++) { - const char *draw_str_i18n = BLF_translate_do(BLF_I18NCONTEXT_DEFAULT, draw_str[i]); + const char *draw_str_i18n = BLT_translate_do(BLT_I18NCONTEXT_DEFAULT, draw_str[i]); const size_t draw_str_i18n_len = strlen(draw_str_i18n); int draw_str_i18n_nbr = 0; diff --git a/source/blender/blenfont/intern/blf_translation.c b/source/blender/blenfont/intern/blf_translation.c deleted file mode 100644 index 5d828d9b7be..00000000000 --- a/source/blender/blenfont/intern/blf_translation.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2011 Blender Foundation. - * All rights reserved. - * - * Contributor(s): Blender Foundation, - * Sergey Sharybin - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/blenfont/intern/blf_translation.c - * \ingroup blf - * - * Manages translation files and provides translation functions. - * (which are optional and can be disabled as a preference). - */ - -#include <stdlib.h> -#include <string.h> - -#include "BLF_translation.h" - -#include "MEM_guardedalloc.h" - -#include "BLI_fileops.h" -#include "BLI_path_util.h" -#include "BLI_string.h" - -#include "BKE_appdir.h" - -#include "DNA_userdef_types.h" /* For user settings. */ - -#ifdef WITH_PYTHON -#include "BPY_extern.h" -#endif - -#ifdef WITH_INTERNATIONAL - -#include "boost_locale_wrapper.h" - -static const char unifont_filename[] = "droidsans.ttf.gz"; -static unsigned char *unifont_ttf = NULL; -static int unifont_size = 0; -static const char unifont_mono_filename[] = "bmonofont-i18n.ttf.gz"; -static unsigned char *unifont_mono_ttf = NULL; -static int unifont_mono_size = 0; -#endif /* WITH_INTERNATIONAL */ - -unsigned char *BLF_get_unifont(int *r_unifont_size) -{ -#ifdef WITH_INTERNATIONAL - if (unifont_ttf == NULL) { - const char * const fontpath = BKE_appdir_folder_id(BLENDER_DATAFILES, "fonts"); - if (fontpath) { - char unifont_path[1024]; - - BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_filename); - - unifont_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_size); - } - else { - printf("%s: 'fonts' data path not found for international font, continuing\n", __func__); - } - } - - *r_unifont_size = unifont_size; - - return unifont_ttf; -#else - (void)r_unifont_size; - return NULL; -#endif -} - -void BLF_free_unifont(void) -{ -#ifdef WITH_INTERNATIONAL - if (unifont_ttf) - MEM_freeN(unifont_ttf); -#else -#endif -} - -unsigned char *BLF_get_unifont_mono(int *r_unifont_size) -{ -#ifdef WITH_INTERNATIONAL - if (unifont_mono_ttf == NULL) { - const char *fontpath = BKE_appdir_folder_id(BLENDER_DATAFILES, "fonts"); - if (fontpath) { - char unifont_path[1024]; - - BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, unifont_mono_filename); - - unifont_mono_ttf = (unsigned char *)BLI_file_ungzip_to_mem(unifont_path, &unifont_mono_size); - } - else { - printf("%s: 'fonts' data path not found for international monospace font, continuing\n", __func__); - } - } - - *r_unifont_size = unifont_mono_size; - - return unifont_mono_ttf; -#else - (void)r_unifont_size; - return NULL; -#endif -} - -void BLF_free_unifont_mono(void) -{ -#ifdef WITH_INTERNATIONAL - if (unifont_mono_ttf) - MEM_freeN(unifont_mono_ttf); -#else -#endif -} - -bool BLF_is_default_context(const char *msgctxt) -{ - /* We use the "short" test, a more complete one could be: - * return (!msgctxt || !msgctxt[0] || STREQ(msgctxt, BLF_I18NCONTEXT_DEFAULT_BPYRNA)) - */ - /* Note: trying without the void string check for now, it *should* not be necessary... */ - return (!msgctxt || msgctxt[0] == BLF_I18NCONTEXT_DEFAULT_BPYRNA[0]); -} - -const char *BLF_pgettext(const char *msgctxt, const char *msgid) -{ -#ifdef WITH_INTERNATIONAL - const char *ret = msgid; - - if (msgid && msgid[0]) { - if (BLF_is_default_context(msgctxt)) { - msgctxt = BLF_I18NCONTEXT_DEFAULT; - } - ret = bl_locale_pgettext(msgctxt, msgid); - /* We assume if the returned string is the same (memory level) as the msgid, no translation was found, - * and we can try py scripts' ones! - */ -#ifdef WITH_PYTHON - if (ret == msgid) { - ret = BPY_app_translations_py_pgettext(msgctxt, msgid); - } -#endif - } - - return ret; -#else - (void)msgctxt; - return msgid; -#endif -} - -bool BLF_translate(void) -{ -#ifdef WITH_INTERNATIONAL - return (U.transopts & USER_DOTRANSLATE) != 0; -#else - return false; -#endif -} - -bool BLF_translate_iface(void) -{ -#ifdef WITH_INTERNATIONAL - return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE); -#else - return false; -#endif -} - -bool BLF_translate_tooltips(void) -{ -#ifdef WITH_INTERNATIONAL - return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS); -#else - return false; -#endif -} - -bool BLF_translate_new_dataname(void) -{ -#ifdef WITH_INTERNATIONAL - return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_NEWDATANAME); -#else - return false; -#endif -} - -const char *BLF_translate_do(const char *msgctxt, const char *msgid) -{ -#ifdef WITH_INTERNATIONAL - if (BLF_translate()) { - return BLF_pgettext(msgctxt, msgid); - } - else { - return msgid; - } -#else - (void)msgctxt; - return msgid; -#endif -} - -const char *BLF_translate_do_iface(const char *msgctxt, const char *msgid) -{ -#ifdef WITH_INTERNATIONAL - if (BLF_translate_iface()) { - return BLF_pgettext(msgctxt, msgid); - } - else { - return msgid; - } -#else - (void)msgctxt; - return msgid; -#endif -} - -const char *BLF_translate_do_tooltip(const char *msgctxt, const char *msgid) -{ -#ifdef WITH_INTERNATIONAL - if (BLF_translate_tooltips()) { - return BLF_pgettext(msgctxt, msgid); - } - else { - return msgid; - } -#else - (void)msgctxt; - return msgid; -#endif -} - -const char *BLF_translate_do_new_dataname(const char *msgctxt, const char *msgid) -{ -#ifdef WITH_INTERNATIONAL - if (BLF_translate_new_dataname()) { - return BLF_pgettext(msgctxt, msgid); - } - else { - return msgid; - } -#else - (void)msgctxt; - return msgid; -#endif -} |