Fix T49150: make new 'operator categories' in search menu i18n-aware.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 23 Aug 2016 19:48:16 +0000 (21:48 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 23 Aug 2016 19:48:16 +0000 (21:48 +0200)
release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
source/blender/editors/interface/interface_regions.c

index 5a3eda567be4d17ae47150924f7465ebf5e8d97f..dc1ddbfe0578de5a8e8310e0372629c16467aac4 100644 (file)
@@ -375,6 +375,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
                 walk_keymap_hierarchy(lvl[3], msgsrc)
 
     # Dump Messages
+    operator_categories = {}
     def process_cls_list(cls_list):
         if not cls_list:
             return
@@ -391,6 +392,16 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
                 cls_id = bl_rna.identifier + "." + cls_id
                 bl_rna = bl_rna.base
             return cls_id
+
+        def operator_category(cls):
+            """Extract operators' categories, as displayed in 'search' space menu."""
+            # NOTE: keep in sync with C code in ui_searchbox_region_draw_cb__operator().
+            if issubclass(cls, bpy.types.OperatorProperties) and "_OT_" in cls.__name__:
+                cat_id = cls.__name__.split("_OT_")[0]
+                if cat_id not in operator_categories:
+                    cat_str = cat_id.capitalize() + ":"
+                    operator_categories[cat_id] = cat_str
+
         if verbose:
             print(cls_list)
         cls_list.sort(key=full_class_id)
@@ -402,6 +413,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
             if (cls in blacklist_rna_class) or issubclass(cls, bpy.types.Operator):
                 reports["rna_structs_skipped"].append(cls)
             else:
+                operator_category(cls)
                 walk_class(cls)
             # Recursively process subclasses.
             process_cls_list(cls.__subclasses__())
@@ -409,6 +421,11 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
     # Parse everything (recursively parsing from bpy_struct "class"...).
     process_cls_list(bpy.types.ID.__base__.__subclasses__())
 
+    # Finalize generated 'operator categories' messages.
+    for cat_str in operator_categories.values():
+        process_msg(msgs, bpy.app.translations.contexts.operator_default, cat_str, "Generated operator category",
+                    reports, check_ctxt_rna, settings)
+
     # And parse keymaps!
     from bpy_extras.keyconfig_utils import KM_HIERARCHY
     walk_keymap_hierarchy(KM_HIERARCHY, "KM_HIERARCHY")
index c621fcf493d0247aafad1802c9db6a565c0a3088..c507401b9a071c9844e3cc08a80cd39f0d62a31f 100644 (file)
@@ -1380,6 +1380,7 @@ static void ui_searchbox_region_draw_cb__operator(const bContext *UNUSED(C), ARe
                        rect_pre.xmax = rect_post.xmin = rect.xmin + ((rect.xmax - rect.xmin) / 4);
 
                        /* widget itself */
+                       /* NOTE: i18n messages extracting tool does the same, please keep it in sync. */
                        {
                                wmOperatorType *ot = data->items.pointers[a];
 
@@ -1400,7 +1401,8 @@ static void ui_searchbox_region_draw_cb__operator(const bContext *UNUSED(C), ARe
                                }
 
                                rect_pre.xmax += 4;  /* sneaky, avoid showing ugly margin */
-                               ui_draw_menu_item(&data->fstyle, &rect_pre, text_pre, data->items.icons[a], state, false);
+                               ui_draw_menu_item(&data->fstyle, &rect_pre, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, text_pre),
+                                                 data->items.icons[a], state, false);
                                ui_draw_menu_item(&data->fstyle, &rect_post, data->items.names[a], 0, state, data->use_sep);
                        }