Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInes Almeida <britalmeida@gmail.com>2018-11-11 17:01:36 +0300
committerInes Almeida <britalmeida@gmail.com>2018-11-11 17:03:02 +0300
commitb3f7398f28756551efbc9fcb8b64b83a81401f88 (patch)
treefa56398b927b5d4bae7e76f07c3e42ec86ff7fd9 /ui_translate
parent70d1e3068584f0ae6b9b2237eb3396d2a70a3f5c (diff)
UI Translate: update to 2.8
Make operator properties into variable annotations. Cleanup includes and descriptions. PEP-8 compliance pass.
Diffstat (limited to 'ui_translate')
-rw-r--r--ui_translate/__init__.py30
-rw-r--r--ui_translate/edit_translation.py295
-rw-r--r--ui_translate/settings.py79
-rw-r--r--ui_translate/update_addon.py98
-rw-r--r--ui_translate/update_svn.py52
-rw-r--r--ui_translate/update_ui.py178
6 files changed, 494 insertions, 238 deletions
diff --git a/ui_translate/__init__.py b/ui_translate/__init__.py
index 5ac0db95..4029bae1 100644
--- a/ui_translate/__init__.py
+++ b/ui_translate/__init__.py
@@ -21,11 +21,11 @@
bl_info = {
"name": "Manage UI translations",
"author": "Bastien Montagne",
- "version": (1, 1, 4),
- "blender": (2, 79, 0),
+ "version": (1, 1, 5),
+ "blender": (2, 80, 0),
"location": "Main \"File\" menu, text editor, any UI control",
- "description": "Allow to manage UI translations directly from Blender "
- "(update main po files, update scripts' translations, etc.)",
+ "description": "Allows managing UI translations directly from Blender "
+ "(update main .po files, update scripts' translations, etc.)",
"warning": "Still in development, not all features are fully implemented yet!",
"wiki_url": "http://wiki.blender.org/index.php/Dev:Doc/How_to/Translate_Blender",
"support": 'OFFICIAL',
@@ -42,15 +42,12 @@ if "bpy" in locals():
else:
import bpy
from . import (
- settings,
- edit_translation,
- update_svn,
- update_addon,
- update_ui,
- )
-
-
-import os
+ settings,
+ edit_translation,
+ update_svn,
+ update_addon,
+ update_ui,
+ )
classes = settings.classes + edit_translation.classes + update_svn.classes + update_addon.classes + update_ui.classes
@@ -59,18 +56,21 @@ classes = settings.classes + edit_translation.classes + update_svn.classes + upd
def register():
for cls in classes:
bpy.utils.register_class(cls)
+
bpy.types.WindowManager.i18n_update_svn_settings = \
- bpy.props.PointerProperty(type=update_ui.I18nUpdateTranslationSettings)
+ bpy.props.PointerProperty(type=update_ui.I18nUpdateTranslationSettings)
# Init addon's preferences (unfortunately, as we are using an external storage for the properties,
# the load/save user preferences process has no effect on them :( ).
if __name__ in bpy.context.user_preferences.addons:
pref = bpy.context.user_preferences.addons[__name__].preferences
+ import os
if os.path.isfile(pref.persistent_data_path):
pref._settings.load(pref.persistent_data_path, reset=True)
def unregister():
- del bpy.types.WindowManager.i18n_update_svn_settings
for cls in classes:
bpy.utils.unregister_class(cls)
+
+ del bpy.types.WindowManager.i18n_update_svn_settings
diff --git a/ui_translate/edit_translation.py b/ui_translate/edit_translation.py
index c66e2fac..8fdf676a 100644
--- a/ui_translate/edit_translation.py
+++ b/ui_translate/edit_translation.py
@@ -18,30 +18,24 @@
# <pep8 compliant>
+import os
+import shutil
if "bpy" in locals():
import importlib
importlib.reload(settings)
importlib.reload(utils_i18n)
else:
import bpy
+ from bpy.types import Operator
from bpy.props import (
- BoolProperty,
- CollectionProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
- PointerProperty,
- StringProperty,
- )
+ BoolProperty,
+ EnumProperty,
+ StringProperty,
+ )
from . import settings
from bl_i18n_utils import utils as utils_i18n
-import os
-import shutil
-
-
# A global cache for I18nMessages objects, as parsing po files takes a few seconds.
PO_CACHE = {}
@@ -52,21 +46,30 @@ def _get_messages(lang, fname):
return PO_CACHE[fname]
-class UI_OT_i18n_edittranslation_update_mo(bpy.types.Operator):
- """Try to "compile" given po file into relevant blender.mo file """ \
- """(WARNING: it will replace the official mo file in your user dir!)"""
+class UI_OT_i18n_edittranslation_update_mo(Operator):
+ """Try to "compile" given po file into relevant blender.mo file
+ (WARNING: it will replace the official mo file in your user dir!)"""
bl_idname = "ui.i18n_edittranslation_update_mo"
bl_label = "Edit Translation Update Mo"
- # "Parameters"
- lang = StringProperty(description="Current (translated) language",
- options={'SKIP_SAVE'})
- po_file = StringProperty(description="Path to the matching po file",
- subtype='FILE_PATH', options={'SKIP_SAVE'})
- clean_mo = BoolProperty(description="Clean up (remove) all local "
- "translation files, to be able to use "
- "all system's ones again",
- default=False, options={'SKIP_SAVE'})
+ # Operator Arguments
+ lang: StringProperty(
+ description="Current (translated) language",
+ options={'SKIP_SAVE'},
+ )
+
+ po_file: StringProperty(
+ description="Path to the matching po file",
+ subtype='FILE_PATH',
+ options={'SKIP_SAVE'},
+ )
+
+ clean_mo: BoolProperty(
+ description="Remove all local translation files, to be able to use the system ones again",
+ default=False,
+ options={'SKIP_SAVE'}
+ )
+ # /End Operator Arguments
def execute(self, context):
if self.clean_mo:
@@ -85,65 +88,169 @@ class UI_OT_i18n_edittranslation_update_mo(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_edittranslation(bpy.types.Operator):
- """Translate the label and tooltip of the property defined by given 'parameters'"""
+class UI_OT_i18n_edittranslation(Operator):
+ """Translate the label and tooltip of the given property"""
bl_idname = "ui.edittranslation"
bl_label = "Edit Translation"
- # "Parameters"
- but_label = StringProperty(description="Label of the control", options={'SKIP_SAVE'})
- rna_label = StringProperty(description="RNA-defined label of the control, if any", options={'SKIP_SAVE'})
- enum_label = StringProperty(description="Label of the enum item of the control, if any", options={'SKIP_SAVE'})
- but_tip = StringProperty(description="Tip of the control", options={'SKIP_SAVE'})
- rna_tip = StringProperty(description="RNA-defined tip of the control, if any", options={'SKIP_SAVE'})
- enum_tip = StringProperty(description="Tip of the enum item of the control, if any", options={'SKIP_SAVE'})
- rna_struct = StringProperty(description="Identifier of the RNA struct, if any", options={'SKIP_SAVE'})
- rna_prop = StringProperty(description="Identifier of the RNA property, if any", options={'SKIP_SAVE'})
- rna_enum = StringProperty(description="Identifier of the RNA enum item, if any", options={'SKIP_SAVE'})
- rna_ctxt = StringProperty(description="RNA context for label", options={'SKIP_SAVE'})
-
- lang = StringProperty(description="Current (translated) language", options={'SKIP_SAVE'})
- po_file = StringProperty(description="Path to the matching po file", subtype='FILE_PATH', options={'SKIP_SAVE'})
+ # Operator Arguments
+ but_label: StringProperty(
+ description="Label of the control",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_label: StringProperty(
+ description="RNA-defined label of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ enum_label: StringProperty(
+ description="Label of the enum item of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ but_tip: StringProperty(
+ description="Tip of the control",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_tip: StringProperty(
+ description="RNA-defined tip of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ enum_tip: StringProperty(
+ description="Tip of the enum item of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_struct: StringProperty(
+ description="Identifier of the RNA struct, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_prop: StringProperty(
+ description="Identifier of the RNA property, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_enum: StringProperty(
+ description="Identifier of the RNA enum item, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ rna_ctxt: StringProperty(
+ description="RNA context for label",
+ options={'SKIP_SAVE'},
+ )
+
+ lang: StringProperty(
+ description="Current (translated) language",
+ options={'SKIP_SAVE'},
+ )
+
+ po_file: StringProperty(
+ description="Path to the matching po file",
+ subtype='FILE_PATH',
+ options={'SKIP_SAVE'},
+ )
# Found in po file.
- org_but_label = StringProperty(description="Original label of the control", options={'SKIP_SAVE'})
- org_rna_label = StringProperty(description="Original RNA-defined label of the control, if any",
- options={'SKIP_SAVE'})
- org_enum_label = StringProperty(description="Original label of the enum item of the control, if any",
- options={'SKIP_SAVE'})
- org_but_tip = StringProperty(description="Original tip of the control", options={'SKIP_SAVE'})
- org_rna_tip = StringProperty(description="Original RNA-defined tip of the control, if any", options={'SKIP_SAVE'})
- org_enum_tip = StringProperty(description="Original tip of the enum item of the control, if any",
- options={'SKIP_SAVE'})
-
- flag_items = (('FUZZY', "Fuzzy", "Message is marked as fuzzy in po file"),
- ('ERROR', "Error", "Some error occurred with this message"),
- )
- but_label_flags = EnumProperty(items=flag_items, description="Flags about the label of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
- rna_label_flags = EnumProperty(items=flag_items, description="Flags about the RNA-defined label of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
- enum_label_flags = EnumProperty(items=flag_items, description="Flags about the RNA enum item label of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
- but_tip_flags = EnumProperty(items=flag_items, description="Flags about the tip of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
- rna_tip_flags = EnumProperty(items=flag_items, description="Flags about the RNA-defined tip of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
- enum_tip_flags = EnumProperty(items=flag_items, description="Flags about the RNA enum item tip of the button",
- options={'SKIP_SAVE', 'ENUM_FLAG'})
-
- stats_str = StringProperty(description="Stats from opened po", options={'SKIP_SAVE'})
- update_po = BoolProperty(description="Update po file, try to rebuild mo file, and refresh Blender UI",
- default=False, options={'SKIP_SAVE'})
- update_mo = BoolProperty(description="Try to rebuild mo file, and refresh Blender UI",
- default=False, options={'SKIP_SAVE'})
- clean_mo = BoolProperty(description="Clean up (remove) all local translation files, to be able to use "
- "all system's ones again",
- default=False, options={'SKIP_SAVE'})
+ org_but_label: StringProperty(
+ description="Original label of the control",
+ options={'SKIP_SAVE'},
+ )
+
+ org_rna_label: StringProperty(
+ description="Original RNA-defined label of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ org_enum_label: StringProperty(
+ description="Original label of the enum item of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ org_but_tip: StringProperty(
+ description="Original tip of the control",
+ options={'SKIP_SAVE'},
+ )
+
+ org_rna_tip: StringProperty(
+ description="Original RNA-defined tip of the control, if any", options={'SKIP_SAVE'}
+ )
+
+ org_enum_tip: StringProperty(
+ description="Original tip of the enum item of the control, if any",
+ options={'SKIP_SAVE'},
+ )
+
+ flag_items = (
+ ('FUZZY', "Fuzzy", "Message is marked as fuzzy in po file"),
+ ('ERROR', "Error", "Some error occurred with this message"),
+ )
+
+ but_label_flags: EnumProperty(
+ description="Flags about the label of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ rna_label_flags: EnumProperty(
+ description="Flags about the RNA-defined label of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ enum_label_flags: EnumProperty(
+ description="Flags about the RNA enum item label of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ but_tip_flags: EnumProperty(
+ description="Flags about the tip of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ rna_tip_flags: EnumProperty(
+ description="Flags about the RNA-defined tip of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ enum_tip_flags: EnumProperty(
+ description="Flags about the RNA enum item tip of the button",
+ items=flag_items,
+ options={'SKIP_SAVE', 'ENUM_FLAG'},
+ )
+
+ stats_str: StringProperty(
+ description="Stats from opened po", options={'SKIP_SAVE'})
+
+ update_po: BoolProperty(
+ description="Update po file, try to rebuild mo file, and refresh Blender's UI",
+ default=False,
+ options={'SKIP_SAVE'},
+ )
+
+ update_mo: BoolProperty(
+ description="Try to rebuild mo file, and refresh Blender's UI",
+ default=False,
+ options={'SKIP_SAVE'},
+ )
+
+ clean_mo: BoolProperty(
+ description="Remove all local translation files, to be able to use the system ones again",
+ default=False,
+ options={'SKIP_SAVE'},
+ )
+ # /End Operator Arguments
def execute(self, context):
if not hasattr(self, "msgmap"):
- self.report('ERROR', "Looks like you did not invoke this operator first!")
+ self.report('ERROR', "invoke() needs to be called before execute()")
return {'CANCELLED'}
msgs = _get_messages(self.lang, self.po_file)
@@ -152,7 +259,6 @@ class UI_OT_i18n_edittranslation(bpy.types.Operator):
if 'ERROR' in getattr(self, mmap["msg_flags"]):
continue
k = mmap["key"]
-# print(k)
if k not in done_keys and len(k) == 1:
k = tuple(k)[0]
msgs.msgs[k].msgstr = getattr(self, mmap["msgstr"])
@@ -160,7 +266,7 @@ class UI_OT_i18n_edittranslation(bpy.types.Operator):
done_keys.add(k)
if self.update_po:
- # Try to overwrite po file, may fail if we have no good rights...
+ # Try to overwrite .po file, may fail if there are no permissions.
try:
msgs.write(kind='PO', dest=self.po_file)
except Exception as e:
@@ -175,19 +281,20 @@ class UI_OT_i18n_edittranslation(bpy.types.Operator):
return {'FINISHED'}
def invoke(self, context, event):
- self.msgmap = {"but_label": {"msgstr": "but_label", "msgid": "org_but_label",
- "msg_flags": "but_label_flags", "key": set()},
- "rna_label": {"msgstr": "rna_label", "msgid": "org_rna_label",
- "msg_flags": "rna_label_flags", "key": set()},
- "enum_label": {"msgstr": "enum_label", "msgid": "org_enum_label",
- "msg_flags": "enum_label_flags", "key": set()},
- "but_tip": {"msgstr": "but_tip", "msgid": "org_but_tip",
- "msg_flags": "but_tip_flags", "key": set()},
- "rna_tip": {"msgstr": "rna_tip", "msgid": "org_rna_tip",
- "msg_flags": "rna_tip_flags", "key": set()},
- "enum_tip": {"msgstr": "enum_tip", "msgid": "org_enum_tip",
- "msg_flags": "enum_tip_flags", "key": set()},
- }
+ self.msgmap = {
+ "but_label": {
+ "msgstr": "but_label", "msgid": "org_but_label", "msg_flags": "but_label_flags", "key": set()},
+ "rna_label": {
+ "msgstr": "rna_label", "msgid": "org_rna_label", "msg_flags": "rna_label_flags", "key": set()},
+ "enum_label": {
+ "msgstr": "enum_label", "msgid": "org_enum_label", "msg_flags": "enum_label_flags", "key": set()},
+ "but_tip": {
+ "msgstr": "but_tip", "msgid": "org_but_tip", "msg_flags": "but_tip_flags", "key": set()},
+ "rna_tip": {
+ "msgstr": "rna_tip", "msgid": "org_rna_tip", "msg_flags": "rna_tip_flags", "key": set()},
+ "enum_tip": {
+ "msgstr": "enum_tip", "msgid": "org_enum_tip", "msg_flags": "enum_tip_flags", "key": set()},
+ }
msgs = _get_messages(self.lang, self.po_file)
msgs.find_best_messages_matches(self, self.msgmap, self.rna_ctxt, self.rna_struct, self.rna_prop, self.rna_enum)
@@ -229,9 +336,8 @@ class UI_OT_i18n_edittranslation(bpy.types.Operator):
if self.org_but_label or self.org_rna_label or self.org_enum_label:
# XXX Can't use box, labels are not enough readable in them :/
box = layout.box()
- #box = layout
box.label(text="Labels:")
- split = box.split(percentage=0.15)
+ split = box.split(factor=0.15)
col1 = split.column()
col2 = split.column()
if self.org_but_label:
@@ -268,9 +374,8 @@ class UI_OT_i18n_edittranslation(bpy.types.Operator):
if self.org_but_tip or self.org_rna_tip or self.org_enum_tip:
# XXX Can't use box, labels are not enough readable in them :/
box = layout.box()
- #box = layout
box.label(text="Tool Tips:")
- split = box.split(percentage=0.15)
+ split = box.split(factor=0.15)
col1 = split.column()
col2 = split.column()
if self.org_but_tip:
diff --git a/ui_translate/settings.py b/ui_translate/settings.py
index 20f7c82e..97bddbc3 100644
--- a/ui_translate/settings.py
+++ b/ui_translate/settings.py
@@ -18,40 +18,46 @@
# <pep8 compliant>
+import os
+
if "bpy" in locals():
import importlib
importlib.reload(settings_i18n)
else:
import bpy
+ from bpy.types import (
+ Operator,
+ AddonPreferences,
+ )
from bpy.props import (
- BoolProperty,
- CollectionProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
- PointerProperty,
- StringProperty,
- )
+ BoolProperty,
+ StringProperty,
+ )
from bl_i18n_utils import settings as settings_i18n
-import os
-
-
settings = settings_i18n.I18nSettings()
-class UI_OT_i18n_settings_load(bpy.types.Operator):
+# Operators ###################################################################
+
+class UI_OT_i18n_settings_load(Operator):
"""Load translations' settings from a persistent JSon file"""
bl_idname = "ui.i18n_settings_load"
bl_label = "I18n Load Settings"
bl_option = {'REGISTER'}
- # "Parameters"
- filepath = StringProperty(description="Path to the saved settings file",
- subtype='FILE_PATH')
- filter_glob = StringProperty(default="*.json", options={'HIDDEN'})
+ # Operator Arguments
+ filepath: StringProperty(
+ subtype='FILE_PATH',
+ description="Path to the saved settings file",
+ )
+
+ filter_glob: StringProperty(
+ default="*.json",
+ options={'HIDDEN'}
+ )
+ # /End Operator Arguments
def invoke(self, context, event):
if not self.properties.is_property_set("filepath"):
@@ -67,16 +73,23 @@ class UI_OT_i18n_settings_load(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_settings_save(bpy.types.Operator):
+class UI_OT_i18n_settings_save(Operator):
"""Save translations' settings in a persistent JSon file"""
bl_idname = "ui.i18n_settings_save"
bl_label = "I18n Save Settings"
bl_option = {'REGISTER'}
- # "Parameters"
- filepath = StringProperty(description="Path to the saved settings file",
- subtype='FILE_PATH')
- filter_glob = StringProperty(default="*.json", options={'HIDDEN'})
+ # Operator Arguments
+ filepath: StringProperty(
+ description="Path to the saved settings file",
+ subtype='FILE_PATH',
+ )
+
+ filter_glob: StringProperty(
+ default="*.json",
+ options={'HIDDEN'},
+ )
+ # /End Operator Arguments
def invoke(self, context, event):
if not self.properties.is_property_set("filepath"):
@@ -92,18 +105,20 @@ class UI_OT_i18n_settings_save(bpy.types.Operator):
return {'FINISHED'}
+# Addon Preferences ###########################################################
+
def _setattr(self, name, val):
print(self, name, val)
setattr(self, name, val)
-class UI_AP_i18n_settings(bpy.types.AddonPreferences):
+class UI_AP_i18n_settings(AddonPreferences):
bl_idname = __name__.split(".")[0] # We want "top" module name!
bl_option = {'REGISTER'}
_settings = settings
- WARN_MSGID_NOT_CAPITALIZED = BoolProperty(
+ WARN_MSGID_NOT_CAPITALIZED: BoolProperty(
name="Warn Msgid Not Capitalized",
description="Warn about messages not starting by a capitalized letter (with a few allowed exceptions!)",
default=True,
@@ -111,7 +126,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: _setattr(self._settings, "WARN_MSGID_NOT_CAPITALIZED", val),
)
- GETTEXT_MSGFMT_EXECUTABLE = StringProperty(
+ GETTEXT_MSGFMT_EXECUTABLE: StringProperty(
name="Gettext 'msgfmt' executable",
description="The gettext msgfmt 'compiler'. You’ll likely have to edit it if you’re under Windows",
subtype='FILE_PATH',
@@ -120,7 +135,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "GETTEXT_MSGFMT_EXECUTABLE", val),
)
- FRIBIDI_LIB = StringProperty(
+ FRIBIDI_LIB: StringProperty(
name="Fribidi Library",
description="The FriBidi C compiled library (.so under Linux, .dll under windows...), you’ll likely have "
"to edit it if you’re under Windows, e.g. using the one included in svn's libraries repository",
@@ -130,7 +145,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "FRIBIDI_LIB", val),
)
- SOURCE_DIR = StringProperty(
+ SOURCE_DIR: StringProperty(
name="Source Root",
description="The Blender source root path",
subtype='FILE_PATH',
@@ -139,7 +154,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "SOURCE_DIR", val),
)
- I18N_DIR = StringProperty(
+ I18N_DIR: StringProperty(
name="Translation Root",
description="The bf-translation repository",
subtype='FILE_PATH',
@@ -148,7 +163,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "I18N_DIR", val),
)
- SPELL_CACHE = StringProperty(
+ SPELL_CACHE: StringProperty(
name="Spell Cache",
description="A cache storing validated msgids, to avoid re-spellchecking them",
subtype='FILE_PATH',
@@ -157,7 +172,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "SPELL_CACHE", val),
)
- PY_SYS_PATHS = StringProperty(
+ PY_SYS_PATHS: StringProperty(
name="Import Paths",
description="Additional paths to add to sys.path (';' separated)",
default="",
@@ -165,7 +180,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
set=lambda self, val: setattr(self._settings, "PY_SYS_PATHS", val),
)
- persistent_data_path = StringProperty(
+ persistent_data_path: StringProperty(
name="Persistent Data Path",
description="The name of a json file storing those settings (unfortunately, Blender's system "
"does not work here)",
@@ -187,7 +202,7 @@ class UI_AP_i18n_settings(bpy.types.AddonPreferences):
layout.prop(self, "PY_SYS_PATHS")
layout.separator()
- split = layout.split(0.75)
+ split = layout.split(factor=0.75)
col = split.column()
col.prop(self, "persistent_data_path")
row = col.row()
diff --git a/ui_translate/update_addon.py b/ui_translate/update_addon.py
index bac3ac45..38b0ac8a 100644
--- a/ui_translate/update_addon.py
+++ b/ui_translate/update_addon.py
@@ -25,16 +25,12 @@ if "bpy" in locals():
importlib.reload(bl_extract_messages)
else:
import bpy
+ from bpy.types import Operator
from bpy.props import (
- BoolProperty,
- CollectionProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
- PointerProperty,
- StringProperty,
- )
+ BoolProperty,
+ EnumProperty,
+ StringProperty,
+ )
from . import settings
from bl_i18n_utils import utils as utils_i18n
from bl_i18n_utils import bl_extract_messages
@@ -49,7 +45,8 @@ import subprocess
import tempfile
-##### Helpers #####
+# Helpers ###################################################################
+
def validate_module(op, context):
module_name = op.module_name
addon = getattr(context, "active_addon", None)
@@ -91,16 +88,27 @@ def enum_addons(self, context):
return _cached_enum_addons
-##### Operators #####
+# Operators ###################################################################
+
# This one is a helper one, as we sometimes need another invoke function (like e.g. file selection)...
-class UI_OT_i18n_addon_translation_invoke(bpy.types.Operator):
+class UI_OT_i18n_addon_translation_invoke(Operator):
"""Wrapper operator which will invoke given op after setting its module_name"""
bl_idname = "ui.i18n_addon_translation_invoke"
bl_label = "Update I18n Add-on"
bl_property = "module_name"
- module_name = EnumProperty(items=enum_addons, name="Add-on", description="Add-on to process", options=set())
- op_id = StringProperty(name="Operator Name", description="Name (id) of the operator to invoke")
+ # Operator Arguments
+ module_name: EnumProperty(
+ name="Add-on",
+ description="Add-on to process",
+ items=enum_addons,
+ options=set(),
+ )
+ op_id: StringProperty(
+ name="Operator Name",
+ description="Name (id) of the operator to invoke",
+ )
+ # /End Operator Arguments
def invoke(self, context, event):
global _cached_enum_addons
@@ -116,17 +124,24 @@ class UI_OT_i18n_addon_translation_invoke(bpy.types.Operator):
op = bpy.ops
for item in self.op_id.split('.'):
op = getattr(op, item, None)
- #print(self.op_id, item, op)
if op is None:
return {'CANCELLED'}
return op('INVOKE_DEFAULT', module_name=self.module_name)
-class UI_OT_i18n_addon_translation_update(bpy.types.Operator):
+
+class UI_OT_i18n_addon_translation_update(Operator):
"""Update given add-on's translation data (found as a py tuple in the add-on's source code)"""
bl_idname = "ui.i18n_addon_translation_update"
bl_label = "Update I18n Add-on"
- module_name = EnumProperty(items=enum_addons, name="Add-on", description="Add-on to process", options=set())
+ # Operator Arguments
+ module_name: EnumProperty(
+ name="Add-on",
+ description="Add-on to process",
+ items=enum_addons,
+ options=set()
+ )
+ # /End Operator Arguments
def execute(self, context):
global _cached_enum_addons
@@ -174,13 +189,23 @@ class UI_OT_i18n_addon_translation_update(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_addon_translation_import(bpy.types.Operator):
+class UI_OT_i18n_addon_translation_import(Operator):
"""Import given add-on's translation data from PO files"""
bl_idname = "ui.i18n_addon_translation_import"
bl_label = "I18n Add-on Import"
- module_name = EnumProperty(items=enum_addons, name="Add-on", description="Add-on to process", options=set())
- directory = StringProperty(maxlen=1024, subtype='FILE_PATH', options={'HIDDEN', 'SKIP_SAVE'})
+ # Operator Arguments
+ module_name: EnumProperty(
+ name="Add-on",
+ description="Add-on to process", options=set(),
+ items=enum_addons,
+ )
+
+ directory: StringProperty(
+ subtype='FILE_PATH', maxlen=1024,
+ options={'HIDDEN', 'SKIP_SAVE'}
+ )
+ # /End Operator Arguments
def _dst(self, trans, path, uid, kind):
if kind == 'PO':
@@ -253,16 +278,37 @@ class UI_OT_i18n_addon_translation_import(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_addon_translation_export(bpy.types.Operator):
+class UI_OT_i18n_addon_translation_export(Operator):
"""Export given add-on's translation data as PO files"""
+
bl_idname = "ui.i18n_addon_translation_export"
bl_label = "I18n Add-on Export"
- module_name = EnumProperty(items=enum_addons, name="Add-on", description="Add-on to process", options=set())
- use_export_pot = BoolProperty(name="Export POT", default=True, description="Export (generate) a POT file too")
- use_update_existing = BoolProperty(name="Update Existing", default=True,
- description="Update existing po files, if any, instead of overwriting them")
- directory = StringProperty(maxlen=1024, subtype='FILE_PATH', options={'HIDDEN', 'SKIP_SAVE'})
+ # Operator Arguments
+ module_name: EnumProperty(
+ name="Add-on",
+ description="Add-on to process",
+ items=enum_addons,
+ options=set()
+ )
+
+ use_export_pot: BoolProperty(
+ name="Export POT",
+ description="Export (generate) a POT file too",
+ default=True,
+ )
+
+ use_update_existing: BoolProperty(
+ name="Update Existing",
+ description="Update existing po files, if any, instead of overwriting them",
+ default=True,
+ )
+
+ directory: StringProperty(
+ subtype='FILE_PATH', maxlen=1024,
+ options={'HIDDEN', 'SKIP_SAVE'}
+ )
+ # /End Operator Arguments
def _dst(self, trans, path, uid, kind):
if kind == 'PO':
diff --git a/ui_translate/update_svn.py b/ui_translate/update_svn.py
index 81435046..28c1f46a 100644
--- a/ui_translate/update_svn.py
+++ b/ui_translate/update_svn.py
@@ -25,16 +25,11 @@ if "bpy" in locals():
importlib.reload(utils_languages_menu)
else:
import bpy
+ from bpy.types import Operator
from bpy.props import (
- BoolProperty,
- CollectionProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
- PointerProperty,
- StringProperty,
- )
+ BoolProperty,
+ EnumProperty,
+ )
from . import settings
from bl_i18n_utils import utils as utils_i18n
from bl_i18n_utils import utils_languages_menu
@@ -46,13 +41,20 @@ import subprocess
import tempfile
-##### Operators #####
-class UI_OT_i18n_updatetranslation_svn_branches(bpy.types.Operator):
+# Operators ###################################################################
+
+class UI_OT_i18n_updatetranslation_svn_branches(Operator):
"""Update i18n svn's branches (po files)"""
bl_idname = "ui.i18n_updatetranslation_svn_branches"
bl_label = "Update I18n Branches"
- use_skip_pot_gen = BoolProperty(name="Skip POT", default=False, description="Skip POT file generation")
+ # Operator Arguments
+ use_skip_pot_gen: BoolProperty(
+ name="Skip POT",
+ description="Skip POT file generation",
+ default=False,
+ )
+ # /End Operator Arguments
def execute(self, context):
if not hasattr(self, "settings"):
@@ -108,7 +110,7 @@ class UI_OT_i18n_updatetranslation_svn_branches(bpy.types.Operator):
return wm.invoke_props_dialog(self)
-class UI_OT_i18n_updatetranslation_svn_trunk(bpy.types.Operator):
+class UI_OT_i18n_updatetranslation_svn_trunk(Operator):
"""Update i18n svn's branches (po files)"""
bl_idname = "ui.i18n_updatetranslation_svn_trunk"
bl_label = "Update I18n Trunk"
@@ -166,14 +168,27 @@ class UI_OT_i18n_updatetranslation_svn_trunk(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_updatetranslation_svn_statistics(bpy.types.Operator):
- """Create or extend a 'i18n_info.txt' Text datablock containing statistics and checks about """
- """current branches and/or trunk"""
+class UI_OT_i18n_updatetranslation_svn_statistics(Operator):
+ """Create or extend a 'i18n_info.txt' Text datablock
+
+ It will contain statistics and checks about current branches and/or trunk.
+ """
bl_idname = "ui.i18n_updatetranslation_svn_statistics"
bl_label = "Update I18n Statistics"
- use_branches = BoolProperty(name="Check Branches", default=True, description="Check po files in branches")
- use_trunk = BoolProperty(name="Check Trunk", default=False, description="Check po files in trunk")
+ # Operator Arguments
+ use_branches: BoolProperty(
+ name="Check Branches",
+ description="Check po files in branches",
+ default=True,
+ )
+
+ use_trunk: BoolProperty(
+ name="Check Trunk",
+ description="Check po files in trunk",
+ default=False,
+ )
+ # /End Operator Arguments
report_name = "i18n_info.txt"
@@ -220,7 +235,6 @@ class UI_OT_i18n_updatetranslation_svn_statistics(bpy.types.Operator):
return {'FINISHED'}
-
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self)
diff --git a/ui_translate/update_ui.py b/ui_translate/update_ui.py
index 91cee4ce..df326d23 100644
--- a/ui_translate/update_ui.py
+++ b/ui_translate/update_ui.py
@@ -18,64 +18,125 @@
# <pep8 compliant>
+import os
+
if "bpy" in locals():
import importlib
importlib.reload(settings)
importlib.reload(utils_i18n)
else:
import bpy
+ from bpy.types import (
+ Operator,
+ Panel,
+ PropertyGroup,
+ UIList,
+ )
from bpy.props import (
- BoolProperty,
- CollectionProperty,
- EnumProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
- PointerProperty,
- StringProperty,
- )
+ BoolProperty,
+ IntProperty,
+ StringProperty,
+ CollectionProperty,
+ )
from . import settings
from bl_i18n_utils import utils as utils_i18n
from bpy.app.translations import pgettext_iface as iface_
-import os
+# Data ########################################################################
-##### Data #####
-class I18nUpdateTranslationLanguage(bpy.types.PropertyGroup):
- """Settings/info about a language"""
- uid = StringProperty(name="Language ID", default="", description="ISO code, like fr_FR")
- num_id = IntProperty(name="Numeric ID", default=0, min=0, description="Numeric ID (readonly!)")
- name = StringProperty(name="Language Name", default="",
- description="English language name/label (like \"French (Français)\")")
- use = BoolProperty(name="Use", default=True, description="Use this language in current operator")
- po_path = StringProperty(name="PO File Path", default="", subtype='FILE_PATH',
- description="Path to the relevant po file in branches")
- po_path_trunk = StringProperty(name="PO Trunk File Path", default="", subtype='FILE_PATH',
- description="Path to the relevant po file in trunk")
- mo_path_trunk = StringProperty(name="MO File Path", default="", subtype='FILE_PATH',
- description="Path to the relevant mo file")
- po_path_git = StringProperty(name="PO Git Master File Path", default="", subtype='FILE_PATH',
- description="Path to the relevant po file in Blender's translations git repository")
-
-
-class I18nUpdateTranslationSettings(bpy.types.PropertyGroup):
+class I18nUpdateTranslationLanguage(PropertyGroup):
+ """Settings/info about a language."""
+
+ uid: StringProperty(
+ name="Language ID",
+ description="ISO code (eg. \"fr_FR\")",
+ default="",
+ )
+
+ num_id: IntProperty(
+ name="Numeric ID",
+ description="Numeric ID (read only!)",
+ default=0, min=0,
+ )
+
+ name: StringProperty(
+ name="Language Name",
+ description="Language label (eg. \"French (Français)\")",
+ default="",
+ )
+
+ use: BoolProperty(
+ name="Use",
+ description="If this language should be used in the current operator",
+ default=True,
+ )
+
+ po_path: StringProperty(
+ name="PO File Path",
+ description="Path to the relevant po file in branches",
+ subtype='FILE_PATH',
+ default="",
+ )
+
+ po_path_trunk: StringProperty(
+ name="PO Trunk File Path",
+ description="Path to the relevant po file in trunk",
+ subtype='FILE_PATH',
+ default="",
+ )
+
+ mo_path_trunk: StringProperty(
+ name="MO File Path",
+ description="Path to the relevant mo file",
+ subtype='FILE_PATH',
+ default="",
+ )
+
+ po_path_git: StringProperty(
+ name="PO Git Master File Path",
+ description="Path to the relevant po file in Blender's translations git repository",
+ subtype='FILE_PATH',
+ default="",
+ )
+
+
+class I18nUpdateTranslationSettings(PropertyGroup):
"""Settings/info about a language"""
- langs = CollectionProperty(name="Languages", type=I18nUpdateTranslationLanguage,
- description="Languages to update in branches")
- active_lang = IntProperty(name="Active Language", default=0,
- description="Index of active language in langs collection")
- pot_path = StringProperty(name="POT File Path", default="", subtype='FILE_PATH',
- description="Path to the pot template file")
- is_init = BoolProperty(default=False, options={'HIDDEN'},
- description="Whether these settings have already been auto-set or not")
-
-
-##### UI #####
-class UI_UL_i18n_languages(bpy.types.UIList):
+
+ langs: CollectionProperty(
+ name="Languages",
+ type=I18nUpdateTranslationLanguage,
+ description="Languages to update in branches",
+ )
+
+ active_lang: IntProperty(
+ name="Active Language",
+ default=0,
+ description="Index of active language in langs collection",
+ )
+
+ pot_path: StringProperty(
+ name="POT File Path",
+ description="Path to the pot template file",
+ subtype='FILE_PATH',
+ default="",
+ )
+
+ is_init: BoolProperty(
+ description="Whether these settings have already been auto-set or not",
+ default=False,
+ options={'HIDDEN'},
+ )
+
+
+# UI ##########################################################################
+
+class UI_UL_i18n_languages(UIList):
+ """ """
+
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
- #assert(isinstance(item, bpy.types.I18nUpdateTranslationLanguage))
if self.layout_type in {'DEFAULT', 'COMPACT'}:
layout.label(item.name, icon_value=icon)
layout.prop(item, "use", text="")
@@ -85,7 +146,9 @@ class UI_UL_i18n_languages(bpy.types.UIList):
layout.prop(item, "use", text="")
-class UI_PT_i18n_update_translations_settings(bpy.types.Panel):
+class UI_PT_i18n_update_translations_settings(Panel):
+ """ """
+
bl_label = "I18n Update Translation"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
@@ -102,7 +165,7 @@ class UI_PT_i18n_update_translations_settings(bpy.types.Panel):
layout.label(text="Could not init languages data!")
layout.label(text="Please edit the preferences of the UI Translate add-on")
else:
- split = layout.split(0.75)
+ split = layout.split(factor=0.75)
split.template_list("UI_UL_i18n_languages", "", i18n_sett, "langs", i18n_sett, "active_lang", rows=8)
col = split.column()
col.operator("ui.i18n_updatetranslation_svn_init_settings", text="Reset Settings")
@@ -132,7 +195,7 @@ class UI_PT_i18n_update_translations_settings(bpy.types.Panel):
layout.prop(i18n_sett, "pot_path")
layout.separator()
- layout.label("Add-ons:")
+ layout.label(text="Add-ons:")
row = layout.row()
op = row.operator("ui.i18n_addon_translation_invoke", text="Refresh I18n Data...")
op.op_id = "ui.i18n_addon_translation_update"
@@ -142,9 +205,11 @@ class UI_PT_i18n_update_translations_settings(bpy.types.Panel):
op.op_id = "ui.i18n_addon_translation_import"
-##### Operators #####
-class UI_OT_i18n_updatetranslation_svn_init_settings(bpy.types.Operator):
+# Operators ###################################################################
+
+class UI_OT_i18n_updatetranslation_svn_init_settings(Operator):
"""Init settings for i18n svn's update operators"""
+
bl_idname = "ui.i18n_updatetranslation_svn_init_settings"
bl_label = "Init I18n Update Settings"
bl_option = {'REGISTER'}
@@ -200,14 +265,25 @@ class UI_OT_i18n_updatetranslation_svn_init_settings(bpy.types.Operator):
return {'FINISHED'}
-class UI_OT_i18n_updatetranslation_svn_settings_select(bpy.types.Operator):
+class UI_OT_i18n_updatetranslation_svn_settings_select(Operator):
"""(De)select (or invert selection of) all languages for i18n svn's update operators"""
+
bl_idname = "ui.i18n_updatetranslation_svn_settings_select"
bl_label = "Init I18n Update Select Languages"
- use_select = BoolProperty(name="Select All", default=True, description="Select all if True, else deselect all")
- use_invert = BoolProperty(name="Invert Selection", default=False,
- description="Inverse selection (overrides 'Select All' when True)")
+ # Operator Arguments
+ use_select: BoolProperty(
+ name="Select All",
+ description="Select all if True, else deselect all",
+ default=True,
+ )
+
+ use_invert: BoolProperty(
+ name="Invert Selection",
+ description="Inverse selection (overrides 'Select All' when True)",
+ default=False,
+ )
+ # /End Operator Arguments
@classmethod
def poll(cls, context):