diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-22 22:25:59 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2011-12-22 22:25:59 +0400 |
commit | 39fd8fa4002391b24d6154ba5489cf1a5a05f5bd (patch) | |
tree | 12d3fe29e26039d0303dec1bd04c5d9e64143d7f /source/blender/blenfont/intern | |
parent | e06a0ba2bb22814392848d0cc7e9f00764e81fce (diff) |
Translation context for RNA properties
This commit implements a way to define context of property which is used by
localization stuff and which is needed to resolve translation context when
some word wit the same english spelling is used in different meanings
(like Manual in meaning of tutorial, and Manual in meaning of something is
setting up by hand).
To define property's context there's a function RNA_def_property_translation_context.
If property doesn't have context, regular BLF_gettext function is used to get
translation of property name, otherwise BLF_pgettext is used for this.
Hence, for correct translation, messages in .po files should be marked
by "msgctxt" context, otherwise property with context declared wouldn't
be translated at all. Toolchain scripts from bf-translation project
would be updated soon.
If context for some values of enumerator property, property itself should
be moved to other context and all items from this enum would be moved to
this context automatically (it's impossible to move one few items to
another context).
P.S. Think context like "BRUSH" or "MODIFIER" are preferable than "NOUN" and "VERB"
because in some cases the same english noun used in different areas better be
translated differently to make translation more native.
Diffstat (limited to 'source/blender/blenfont/intern')
-rw-r--r-- | source/blender/blenfont/intern/blf_lang.c | 9 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_translation.c | 45 |
2 files changed, 48 insertions, 6 deletions
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c index 77f9542883c..430780b19a0 100644 --- a/source/blender/blenfont/intern/blf_lang.c +++ b/source/blender/blenfont/intern/blf_lang.c @@ -58,7 +58,6 @@ #include "BLI_utildefines.h" #include "BLI_path_util.h" -#define DOMAIN_NAME "blender" #define SYSTEM_ENCODING_DEFAULT "UTF-8" #define FONT_SIZE_DEFAULT 12 @@ -205,15 +204,15 @@ void BLF_lang_set(const char *str) setlocale(LC_NUMERIC, "C"); - textdomain(DOMAIN_NAME); - bindtextdomain(DOMAIN_NAME, global_messagepath); - bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name); + textdomain(TEXT_DOMAIN_NAME); + bindtextdomain(TEXT_DOMAIN_NAME, global_messagepath); + bind_textdomain_codeset(TEXT_DOMAIN_NAME, global_encoding_name); } void BLF_lang_encoding(const char *str) { BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name)); - /* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */ + /* bind_textdomain_codeset(TEXT_DOMAIN_NAME, encoding_name); */ } #else /* ! WITH_INTERNATIONAL */ diff --git a/source/blender/blenfont/intern/blf_translation.c b/source/blender/blenfont/intern/blf_translation.c index fe14f5d4d1c..1d82abcf32d 100644 --- a/source/blender/blenfont/intern/blf_translation.c +++ b/source/blender/blenfont/intern/blf_translation.c @@ -29,9 +29,19 @@ */ #include <stdlib.h> +#include <string.h> #ifdef WITH_INTERNATIONAL #include <libintl.h> +#include <locale.h> + +#define GETTEXT_CONTEXT_GLUE "\004" + +/* needed for windows version of gettext */ +#ifndef LC_MESSAGES +# define LC_MESSAGES 1729 +#endif + #endif #include "MEM_guardedalloc.h" @@ -91,6 +101,40 @@ const char* BLF_gettext(const char *msgid) #endif } +const char *BLF_pgettext(const char *context, const char *message) +{ +#ifdef WITH_INTERNATIONAL + char static_msg_ctxt_id[1024]; + char *dynamic_msg_ctxt_id = NULL; + char *msg_ctxt_id; + const char *translation; + + size_t overall_length = strlen(context) + strlen(message) + sizeof(GETTEXT_CONTEXT_GLUE) + 1; + + if (overall_length > sizeof(static_msg_ctxt_id)) { + dynamic_msg_ctxt_id = malloc(overall_length); + msg_ctxt_id = dynamic_msg_ctxt_id; + } + else { + msg_ctxt_id = static_msg_ctxt_id; + } + + sprintf(msg_ctxt_id, "%s%s%s", context, GETTEXT_CONTEXT_GLUE, message); + + translation = (char*)dcgettext(TEXT_DOMAIN_NAME, msg_ctxt_id, LC_MESSAGES); + + if (dynamic_msg_ctxt_id) + free(dynamic_msg_ctxt_id); + + if (translation == msg_ctxt_id) + translation = message; + + return translation; +#else + return message; +#endif +} + int BLF_translate_iface(void) { #ifdef WITH_INTERNATIONAL @@ -132,4 +176,3 @@ const char *BLF_translate_do_tooltip(const char *msgid) return msgid; #endif } - |