[Bf-blender-cvs] [3239cea726c] blender-v3.3-release: I18n: make presets translatable

Damien Picard noreply at git.blender.org
Mon Aug 1 14:31:37 CEST 2022


Commit: 3239cea726c7409f9fc6be53c078c3087a76c233
Author: Damien Picard
Date:   Mon Aug 1 14:09:41 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB3239cea726c7409f9fc6be53c078c3087a76c233

I18n: make presets translatable

Presets are used all over the Blender UI, but were so far untranslatable.

This adds the translation code as well as a new `dump_preset_messages()` function in the message extraction. This goes over all bundled preset file names and extracts them.

Reviewed By: mont29

Differential Revision: https://developer.blender.org/D15570

===================================================================

M	release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
M	release/scripts/modules/bl_i18n_utils/settings.py
M	release/scripts/modules/bpy_types.py

===================================================================

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 bfc111dd3c1..d7755532614 100644
--- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
+++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
@@ -853,6 +853,25 @@ def dump_src_messages(msgs, reports, settings):
             dump_src_file(path, rel_path, msgs, reports, settings)
 
 
+def dump_preset_messages(msgs, reports, settings):
+    files = []
+    for dpath, _, fnames in os.walk(settings.PRESETS_DIR):
+        for fname in fnames:
+            if fname.startswith("_") or not fname.endswith(".py"):
+                continue
+            path = os.path.join(dpath, fname)
+            try:  # can't always find the relative path (between drive letters on windows)
+                rel_path = os.path.relpath(path, settings.PRESETS_DIR)
+            except ValueError:
+                rel_path = path
+            files.append(rel_path)
+    for rel_path in files:
+        msgsrc, msgid = os.path.split(rel_path)
+        msgsrc = "Preset from " + msgsrc
+        msgid = bpy.path.display_name(msgid, title_case=False)
+        process_msg(msgs, settings.DEFAULT_CONTEXT, msgid, msgsrc, reports, None, settings)
+
+
 ##### Main functions! #####
 def dump_messages(do_messages, do_checks, settings):
     bl_ver = "Blender " + bpy.app.version_string
@@ -885,6 +904,9 @@ def dump_messages(do_messages, do_checks, settings):
     # Get strings from C source code.
     dump_src_messages(msgs, reports, settings)
 
+    # Get strings from presets.
+    dump_preset_messages(msgs, reports, settings)
+
     # Get strings from addons' categories.
     for uid, label, tip in bpy.types.WindowManager.addon_filter.keywords['items'](
             bpy.context.window_manager,
diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py
index 3b69f8a6bf7..8d6d4fb5d3b 100644
--- a/release/scripts/modules/bl_i18n_utils/settings.py
+++ b/release/scripts/modules/bl_i18n_utils/settings.py
@@ -514,6 +514,9 @@ REL_GIT_I18N_PO_DIR = os.path.join("po")
 # The Blender source path to check for i18n macros (relative to SOURCE_DIR).
 REL_POTFILES_SOURCE_DIR = os.path.join("source")
 
+# Where to search for preset names (relative to SOURCE_DIR).
+REL_PRESETS_DIR = os.path.join("release", "scripts", "presets")
+
 # The template messages file (relative to I18N_DIR).
 REL_FILE_NAME_POT = os.path.join(REL_BRANCHES_DIR, DOMAIN + ".pot")
 
@@ -672,6 +675,7 @@ class I18nSettings:
     GIT_I18N_ROOT = property(*(_gen_get_set_path("SOURCE_DIR", "REL_GIT_I18N_DIR")))
     GIT_I18N_PO_DIR = property(*(_gen_get_set_path("GIT_I18N_ROOT", "REL_GIT_I18N_PO_DIR")))
     POTFILES_SOURCE_DIR = property(*(_gen_get_set_path("SOURCE_DIR", "REL_POTFILES_SOURCE_DIR")))
+    PRESETS_DIR = property(*(_gen_get_set_path("SOURCE_DIR", "REL_PRESETS_DIR")))
     FILE_NAME_POT = property(*(_gen_get_set_path("I18N_DIR", "REL_FILE_NAME_POT")))
     MO_PATH_ROOT = property(*(_gen_get_set_path("I18N_DIR", "REL_MO_PATH_ROOT")))
     MO_PATH_TEMPLATE = property(*(_gen_get_set_path("I18N_DIR", "REL_MO_PATH_TEMPLATE")))
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index df0631ec26d..87b32eb1f40 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -1074,6 +1074,7 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
         - preset_operator_defaults (dict of keyword args)
         """
         import bpy
+        from bpy.app.translations import pgettext_iface as iface_
         ext_valid = getattr(self, "preset_extensions", {".py", ".xml"})
         props_default = getattr(self, "preset_operator_defaults", None)
         add_operator = getattr(self, "preset_add_operator", None)
@@ -1083,7 +1084,8 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
             props_default=props_default,
             filter_ext=lambda ext: ext.lower() in ext_valid,
             add_operator=add_operator,
-            display_name=lambda name: bpy.path.display_name(name, title_case=False)
+            display_name=lambda name: iface_(
+                bpy.path.display_name(name, title_case=False))
         )
 
     @classmethod



More information about the Bf-blender-cvs mailing list