Fix physics' name not translated in main physics panel (reported on bf-translations...
authorBastien Montagne <montagne29@wanadoo.fr>
Wed, 13 Feb 2013 11:52:01 +0000 (11:52 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Wed, 13 Feb 2013 11:52:01 +0000 (11:52 +0000)
This also revealed another bug, as you could not explicitely set default context to text_ctxt UI func parameter (None is not accpeted by RNA string props), so I had to change default context from py POV to "*" instead of None.

Anyway, that physics UI translation remains weak, as the trick used here (helper func) prevents message extractor script to directly find them. Currently it works because specified labels are also defined elsewhere, but it would be nice to have some kind of "translation markers" in py code too (similar to our N_/CTX_N_ C macros, unfortunately python does not have preprocessing ;) )...

release/scripts/startup/bl_ui/properties_physics_common.py
source/blender/blenfont/BLF_translation.h
source/blender/blenfont/intern/blf_translation.c
source/blender/python/intern/bpy_app_translations.c

index a640cb215ba2dc1fa76edc07304beadfd5e01bdf..90cf397f526e936fa110e025ea2db8fc77a46a8d 100644 (file)
@@ -21,6 +21,8 @@
 import bpy
 from bpy.types import Panel
 
+i18n_default_ctxt = bpy.app.translations.contexts.default
+
 
 class PhysicButtonsPanel():
     bl_space_type = 'PROPERTIES'
@@ -37,20 +39,20 @@ def physics_add(self, layout, md, name, type, typeicon, toggles):
     sub = layout.row(align=True)
     if md:
         sub.context_pointer_set("modifier", md)
-        sub.operator("object.modifier_remove", text=name, icon='X')
+        sub.operator("object.modifier_remove", text=name, text_ctxt=i18n_default_ctxt, icon='X')
         if(toggles):
             sub.prop(md, "show_render", text="")
             sub.prop(md, "show_viewport", text="")
     else:
-        sub.operator("object.modifier_add", text=name, icon=typeicon).type = type
+        sub.operator("object.modifier_add", text=name, text_ctxt=i18n_default_ctxt, icon=typeicon).type = type
 
 
 def physics_add_special(self, layout, data, name, addop, removeop, typeicon):
     sub = layout.row(align=True)
     if data:
-        sub.operator(removeop, text=name, icon='X')
+        sub.operator(removeop, text=name, text_ctxt=i18n_default_ctxt, icon='X')
     else:
-        sub.operator(addop, text=name, icon=typeicon)
+        sub.operator(addop, text=name, text_ctxt=i18n_default_ctxt, icon=typeicon)
 
 
 class PHYSICS_PT_add(PhysicButtonsPanel, Panel):
index 35ca5f19bdc890dc7dcf4a7969c48f1d3744844c..fd8b30d1d1b7997a0206c887bd918c8d486fe524 100644 (file)
@@ -112,9 +112,13 @@ const char *BLF_translate_do_tooltip(const char *msgctxt, const char *msgid);
 
 /* 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... :/
+ *       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  /* Translated as None in Python. */
-#define BLF_I18NCONTEXT_DEFAULT_BPY_INTERN ""  /* Only used in code, never exposed to user! */
+#define BLF_I18NCONTEXT_DEFAULT NULL
+#define BLF_I18NCONTEXT_DEFAULT_BPY "*"
 
 /* Default context for operator names/labels. */
 #define BLF_I18NCONTEXT_OPERATOR_DEFAULT "Operator"
@@ -165,7 +169,8 @@ typedef struct
 #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"),                                                         \
+       BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_DEFAULT, "default_real"),                                                    \
+       BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_DEFAULT_BPY, "default"),                                                     \
        BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "operator_default"),                                       \
        BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ACTION, "id_action"),                                                     \
        BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ARMATURE, "id_armature"),                                                 \
index a77b464822bce4da9946701dce8cf1d78da99476..b5b72b686774f71acced2c8a423181c159f37968 100644 (file)
@@ -94,9 +94,9 @@ const char *BLF_pgettext(const char *msgctxt, const char *msgid)
                const char *ret;
 
                /*if (msgctxt && !strcmp(msgctxt, BLF_I18NCONTEXT_DEFAULT_BPY_INTERN)) { */
-               if (msgctxt && !msgctxt[0]) {
-                       /* BLF_I18NCONTEXT_DEFAULT_BPY_INTERN context is reserved and considered the same as default NULL one. */
-                       msgctxt = NULL;
+               if (msgctxt && msgctxt[0] == BLF_I18NCONTEXT_DEFAULT_BPY[0]) {
+                       /* BLF_I18NCONTEXT_DEFAULT_BPY context is reserved and considered the same as default NULL one. */
+                       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,
index 6839c0b12a662b506a6c24a0538d5d3b17f9fe85..6d69e8b1592f499af9d4947bc994cd7da2d822e0 100644 (file)
@@ -74,7 +74,7 @@ typedef struct GHashKey {
 static GHashKey *_ghashutil_keyalloc(const void *msgctxt, const void *msgid)
 {
        GHashKey *key = MEM_mallocN(sizeof(GHashKey), "Py i18n GHashKey");
-       key->msgctxt = BLI_strdup(msgctxt ? msgctxt : BLF_I18NCONTEXT_DEFAULT_BPY_INTERN);
+       key->msgctxt = BLI_strdup(msgctxt ? msgctxt : BLF_I18NCONTEXT_DEFAULT_BPY);
        key->msgid = BLI_strdup(msgid);
        return key;
 }
@@ -195,7 +195,7 @@ static void _build_translations_cache(PyObject *py_messages, const char *locale)
                                else {
                                        PyObject *tmp = PyTuple_GET_ITEM(pykey, 0);
                                        if (tmp == Py_None) {
-                                               msgctxt = BLF_I18NCONTEXT_DEFAULT;
+                                               msgctxt = BLF_I18NCONTEXT_DEFAULT_BPY;
                                        }
                                        else if (PyUnicode_Check(tmp)) {
                                                msgctxt = _PyUnicode_AsString(tmp);
@@ -288,9 +288,7 @@ const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *ms
 
        _ghashutil_keyfree((void *)key);
 
-       if (tmp)
-               return tmp;
-       return msgid;
+       return tmp ? tmp : msgid;
 
 #undef STATIC_LOCALE_SIZE
 }
@@ -435,8 +433,8 @@ static PyObject *app_translations_contexts_make(void)
 
 PyDoc_STRVAR(app_translations_contexts_doc,
        "A named tuple containing all pre-defined translation contexts.\n"
-       "WARNING: do not use the \"" BLF_I18NCONTEXT_DEFAULT_BPY_INTERN "\" context, it is internally assimilated as the "
-       "default one!\n"
+       "WARNING: Never use a (new) context starting with \"" BLF_I18NCONTEXT_DEFAULT_BPY "\", it would be internally "
+       "assimilated as the default one!\n"
 );
 
 PyDoc_STRVAR(app_translations_contexts_C_to_py_doc,
@@ -503,8 +501,7 @@ static PyObject *_py_pgettext(PyObject *args, PyObject *kw, const char *(*_pgett
 #ifdef WITH_INTERNATIONAL
        char *msgid, *msgctxt = NULL;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "s|z:bpy.app.translations.pgettext", (char **)kwlist,
-                                        &msgid, &msgctxt))
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "s|z:bpy.app.translations.pgettext", (char **)kwlist, &msgid, &msgctxt))
        {
                return NULL;
        }
@@ -514,8 +511,7 @@ static PyObject *_py_pgettext(PyObject *args, PyObject *kw, const char *(*_pgett
        PyObject *msgid, *msgctxt;
        (void)_pgettext;
 
-       if (!PyArg_ParseTupleAndKeywords(args, kw, "O|O:bpy.app.translations.pgettext", (char **)kwlist,
-                                        &msgid, &msgctxt))
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "O|O:bpy.app.translations.pgettext", (char **)kwlist, &msgid, &msgctxt))
        {
                return NULL;
        }