From 2ecaa971f090810d08bee468d25c5ea0ab2563d3 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 3 Nov 2021 15:56:39 +0100 Subject: I18n: Fix several issues with UI messages extraction script. * Fix systematic skipping of labels when they are the same as the identifier (Some cases are valid, like `RGB` or `HSV` e.g.). * Add instead heuristics checks to skip non-UI properties (non-capitalized, or same name as identifier and Operator properties, mainly). * Skip `bl_icon` and `icon` properties. * Properly search for properties in all parent classes (some cases with e.g. `Panel` would break due to intermediary utils classes, leading to those internal UI properties not being skipped as expected). Related to T43295. --- .../modules/bl_i18n_utils/bl_extract_messages.py | 37 ++++++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'release/scripts/modules') diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 49dbac1d502..00edd7d523d 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -252,27 +252,50 @@ def dump_rna_messages(msgs, reports, settings, verbose=False): # Function definitions def walk_properties(cls): + # This handles properties whose name is the same as their identifier. + # Usually, it means that those are internal properties not exposed in the UI, however there are some cases + # where the UI label is actually defined and same as the identifier (color spaces e.g., `RGB` etc.). + # So we only exclude those properties in case they belong to an operator for now. + def prop_name_validate(cls, prop_name, prop_identifier): + if prop_name != prop_identifier: + return True + # Heuristic: A lot of operator's HIDDEN properties have no UI label/description. + # While this is not ideal (for API doc purposes, description should always be provided), + # for now skip those properties. + # 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__: + return False + # Heuristic: If UI label is not capitalized, it is likely a private (undocumented) property, + # that can be skipped. + if prop_name and not prop_name[0].isupper(): + return False + return True + bl_rna = cls.bl_rna # Get our parents' properties, to not export them multiple times. bl_rna_base = bl_rna.base + bl_rna_base_props = set() if bl_rna_base: - bl_rna_base_props = set(bl_rna_base.properties.values()) - else: - bl_rna_base_props = set() + bl_rna_base_props |= set(bl_rna_base.properties.values()) + for cls_base in cls.__bases__: + bl_rna_base = getattr(cls_base, "bl_rna", None) + if not bl_rna_base: + continue + bl_rna_base_props |= set(bl_rna_base.properties.values()) props = sorted(bl_rna.properties, key=lambda p: p.identifier) for prop in props: # Only write this property if our parent hasn't got it. if prop in bl_rna_base_props: continue - if prop.identifier == "rna_type": + if prop.identifier in {"rna_type", "bl_icon", "icon"}: continue reports["rna_props"].append((cls, prop)) msgsrc = "bpy.types.{}.{}".format(bl_rna.identifier, prop.identifier) msgctxt = prop.translation_context or default_context - if prop.name and (prop.name != prop.identifier or msgctxt != default_context): + if prop.name and prop_name_validate(cls, prop.name, prop.identifier): process_msg(msgs, msgctxt, prop.name, msgsrc, reports, check_ctxt_rna, settings) if prop.description: process_msg(msgs, default_context, prop.description, msgsrc, reports, check_ctxt_rna_tip, settings) @@ -282,7 +305,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False): for item in prop.enum_items: msgsrc = "bpy.types.{}.{}:'{}'".format(bl_rna.identifier, prop.identifier, item.identifier) done_items.add(item.identifier) - if item.name and item.name != item.identifier: + if item.name and prop_name_validate(cls, item.name, item.identifier): process_msg(msgs, msgctxt, item.name, msgsrc, reports, check_ctxt_rna, settings) if item.description: process_msg(msgs, default_context, item.description, msgsrc, reports, check_ctxt_rna_tip, @@ -292,7 +315,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False): continue msgsrc = "bpy.types.{}.{}:'{}'".format(bl_rna.identifier, prop.identifier, item.identifier) done_items.add(item.identifier) - if item.name and item.name != item.identifier: + if item.name and prop_name_validate(cls, item.name, item.identifier): process_msg(msgs, msgctxt, item.name, msgsrc, reports, check_ctxt_rna, settings) if item.description: process_msg(msgs, default_context, item.description, msgsrc, reports, check_ctxt_rna_tip, -- cgit v1.2.3