diff options
Diffstat (limited to 'source/blender/blenfont/intern/blf_lang.c')
-rw-r--r-- | source/blender/blenfont/intern/blf_lang.c | 146 |
1 files changed, 99 insertions, 47 deletions
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c index 0ed48623dd5..65abfc52ee5 100644 --- a/source/blender/blenfont/intern/blf_lang.c +++ b/source/blender/blenfont/intern/blf_lang.c @@ -27,30 +27,28 @@ * \ingroup blf */ - -#include "BLF_translation.h" /* own include */ - -#ifdef WITH_INTERNATIONAL - #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "boost_locale_wrapper.h" - -#include "BKE_global.h" - -#include "DNA_userdef_types.h" - #include "RNA_types.h" -#include "MEM_guardedalloc.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 "BLI_utildefines.h" + +#include "BKE_global.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; @@ -58,9 +56,6 @@ static int num_locales = 0; static EnumPropertyItem *locales_menu = NULL; static int num_locales_menu = 0; -#define ULANGUAGE ((U.language >= 0 && U.language < num_locales) ? U.language : 0) -#define LOCALE(_id) (locales ? locales[_id] : "") - static void free_locales(void) { if (locales) { @@ -83,15 +78,16 @@ static void free_locales(void) static void fill_locales(void) { - char *languages_path = BLI_get_folder(BLENDER_DATAFILES, "locale"); + const char * const languages_path = BLI_get_folder(BLENDER_DATAFILES, "locale"); + char languages[FILE_MAX]; LinkNode *lines = NULL, *line; char *str; int idx = 0; free_locales(); - BLI_join_dirfile(languages_path, FILE_MAX, languages_path, "languages"); - line = lines = BLI_file_read_as_lines(languages_path); + 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! */ @@ -99,7 +95,7 @@ static void fill_locales(void) /* First loop to find highest locale ID */ while (line) { int t; - str = (char*) line->link; + str = (char *)line->link; if (str[0] == '#' || str[0] == '\0') { line = line->next; continue; /* Comment or void... */ @@ -112,17 +108,17 @@ static void fill_locales(void) } num_locales_menu++; /* The "closing" void item... */ - /* And now, buil locales and locale_menu! */ + /* 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__); + locales = MEM_callocN(num_locales * sizeof(char *), __func__); while (line) { int id; char *loc, *sep1, *sep2, *sep3; - str = (char*) line->link; + str = (char *)line->link; if (str[0] == '#' || str[0] == '\0') { line = line->next; continue; @@ -176,15 +172,21 @@ static void fill_locales(void) 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) { - char *messagepath = BLI_get_folder(BLENDER_DATAFILES, "locale"); +#ifdef WITH_INTERNATIONAL + const char * const messagepath = BLI_get_folder(BLENDER_DATAFILES, "locale"); if (messagepath) { bl_locale_init(messagepath, TEXT_DOMAIN_NAME); @@ -193,15 +195,26 @@ void BLF_lang_init(void) 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; @@ -229,40 +242,79 @@ void BLF_lang_set(const char *str) bl_locale_set(short_locale_utf8); if (short_locale[0]) { - MEM_freeN((void*)short_locale_utf8); + MEM_freeN((void *)short_locale_utf8); } +#else + (void)str; +#endif } +/* Get the current locale (short code, e.g. es_ES). */ const char *BLF_lang_get(void) { - int uilang = ULANGUAGE; - return LOCALE(uilang); +#ifdef WITH_INTERNATIONAL + 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; +#else + return ""; +#endif } #undef LOCALE #undef ULANGUAGE -#else /* ! WITH_INTERNATIONAL */ - -void BLF_lang_init(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: 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) { - return; -} + char *m1, *m2, *_t = NULL; -void BLF_lang_free(void) -{ - return; -} + m1 = strchr(locale, '_'); + m2 = strchr(locale, '@'); -void BLF_lang_set(const char *str) -{ - (void)str; - return; -} - -const char *BLF_lang_get(void) -{ - return ""; + 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); + } } - -#endif /* WITH_INTERNATIONAL */ |