[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4459] trunk/py/scripts/addons/ ui_translate: Add base for addons' i18n tools.
Bastien Montagne
montagne29 at wanadoo.fr
Tue Apr 9 11:00:06 CEST 2013
Revision: 4459
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4459
Author: mont29
Date: 2013-04-09 08:59:56 +0000 (Tue, 09 Apr 2013)
Log Message:
-----------
Add base for addons' i18n tools. WARNING: nearly nothing is functionnal yet!
Also a few minor edits (and add a version number to this addon!)...
Modified Paths:
--------------
trunk/py/scripts/addons/ui_translate/__init__.py
trunk/py/scripts/addons/ui_translate/update_svn.py
Added Paths:
-----------
trunk/py/scripts/addons/ui_translate/update_addon.py
Modified: trunk/py/scripts/addons/ui_translate/__init__.py
===================================================================
--- trunk/py/scripts/addons/ui_translate/__init__.py 2013-04-09 08:52:08 UTC (rev 4458)
+++ trunk/py/scripts/addons/ui_translate/__init__.py 2013-04-09 08:59:56 UTC (rev 4459)
@@ -21,7 +21,8 @@
bl_info = {
"name": "Manage UI translations",
"author": "Bastien Montagne",
- "blender": (2, 65, 10),
+ "version": (1, 0, 1),
+ "blender": (2, 66, 5),
"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.)",
@@ -37,11 +38,13 @@
imp.reload(settings)
imp.reload(edit_translation)
imp.reload(update_svn)
+ imp.reload(update_addon)
else:
import bpy
from . import settings
from . import edit_translation
from . import update_svn
+ from . import update_addon
import os
@@ -62,4 +65,5 @@
def unregister():
del bpy.types.WindowManager.i18n_update_svn_settings
+
bpy.utils.unregister_module(__name__)
Added: trunk/py/scripts/addons/ui_translate/update_addon.py
===================================================================
--- trunk/py/scripts/addons/ui_translate/update_addon.py (rev 0)
+++ trunk/py/scripts/addons/ui_translate/update_addon.py 2013-04-09 08:59:56 UTC (rev 4459)
@@ -0,0 +1,305 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+if "bpy" in locals():
+ import imp
+ imp.reload(settings)
+ imp.reload(utils_i18n)
+ imp.reload(bl_extract_messages)
+else:
+ import bpy
+ from bpy.props import (BoolProperty,
+ CollectionProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+ PointerProperty,
+ StringProperty,
+ )
+ from . import settings
+ from bl_i18n_utils import utils as utils_i18n
+ from bl_i18n_utils import bl_extract_messages
+
+from bpy.app.translations import pgettext_iface as iface_
+import addon_utils
+
+import io
+import os
+import shutil
+import subprocess
+import tempfile
+
+
+##### Helpers #####
+def validate_module(op, context):
+ module_name = op.module_name
+ addon = getattr(context, "active_addon", None)
+ if addon:
+ module_name = addon.module
+
+ if not module_name:
+ op.report({'ERROR'}, "No addon module given!")
+ return None, None
+
+ mod = utils_i18n.enable_addons(addons={module_name}, check_only=True)
+ if not mod:
+ op.report({'ERROR'}, "Addon '{}' not found!".format(module_name))
+ return None, None
+ return module_name, mod[0]
+
+
+# As it's a bit time heavy, we cache that enum, operators using this should invalidate the cache in Invoke func
+# at least.
+def enum_addons(self, context):
+ items = getattr(self.__class__, "__enum_addons_cache", [])
+ print(items)
+ if not items:
+ setts = getattr(self, "settings", settings.settings)
+ for mod in addon_utils.modules(addon_utils.addons_fake_modules):
+ mod_info = addon_utils.module_bl_info(mod)
+ # Skip OFFICIAL addons, they are already translated in main i18n system (together with Blender itself).
+ if mod_info["support"] in {'OFFICIAL'}:
+ continue
+ src = mod.__file__
+ if src.endswith("__init__.py"):
+ src = os.path.dirname(src)
+ has_translation, _ = utils_i18n.I18n.check_py_module_has_translations(src, setts)
+ name = mod_info["name"]
+ #if has_translation:
+ #name = name + " *"
+ items.append((mod.__name__, name, mod_info["description"]))
+ items.sort(key=lambda i: i[1])
+ if hasattr(self.__class__, "__enum_addons_cache"):
+ self.__class__.__enum_addons_cache = items
+ return items
+
+
+##### Data #####
+
+
+##### UI #####
+#class UI_PT_i18n_update_translations_settings(bpy.types.Panel):
+ #bl_label = "I18n Update Translation Main"
+ #bl_space_type = "PROPERTIES"
+ #bl_region_type = "WINDOW"
+ #bl_context = "render"
+#
+ #def draw(self, context):
+ #layout = self.layout
+ #i18n_sett = context.window_manager.i18n_update_svn_settings
+#
+ #if not i18n_sett.is_init and bpy.ops.ui.i18n_updatetranslation_svn_init_settings.poll():
+ #bpy.ops.ui.i18n_updatetranslation_svn_init_settings()
+#
+ #if not i18n_sett.is_init:
+ #layout.label(text="Could not init languages data!")
+ #layout.label(text="Please edit the preferences of the UI Translate addon")
+ #else:
+ #split = layout.split(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")
+ #if any(l.use for l in i18n_sett.langs):
+ #col.operator("ui.i18n_updatetranslation_svn_settings_select", text="Deselect All").use_select = False
+ #else:
+ #col.operator("ui.i18n_updatetranslation_svn_settings_select", text="Select All").use_select = True
+ #col.operator("ui.i18n_updatetranslation_svn_settings_select", text="Invert Selection").use_invert = True
+ #col.separator()
+ #col.operator("ui.i18n_updatetranslation_svn_branches", text="Update Branches")
+ #col.operator("ui.i18n_updatetranslation_svn_trunk", text="Update Trunk")
+ #col.operator("ui.i18n_updatetranslation_svn_statistics", text="Statistics")
+#
+ #if i18n_sett.active_lang >= 0 and i18n_sett.active_lang < len(i18n_sett.langs):
+ #lng = i18n_sett.langs[i18n_sett.active_lang]
+ #col = layout.column()
+ #col.active = lng.use
+ #row = col.row()
+ #row.label(text="[{}]: \"{}\" ({})".format(lng.uid, iface_(lng.name), lng.num_id), translate=False)
+ #row.prop(lng, "use", text="")
+ #col.prop(lng, "po_path")
+ #col.prop(lng, "po_path_trunk")
+ #col.prop(lng, "mo_path_trunk")
+ #layout.separator()
+ #layout.prop(i18n_sett, "pot_path")
+
+
+##### 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):
+ """Wrapper operator which will invoke given op after setting its module_name"""
+ bl_idname = "ui.i18n_addon_translation_invoke"
+ bl_label = "Update I18n Addon"
+ bl_property = "module_name"
+
+ module_name = EnumProperty(items=enum_addons, name="Addon", description="Addon to process", options=set())
+ op_id = StringProperty(name="Operator Name", description="Name (id) of the operator to invoke")
+
+ __enum_addons_cache = []
+
+ def invoke(self, context, event):
+ print("op_id:", self.op_id)
+ self.__enum_addons_cache.clear()
+ context.window_manager.invoke_search_popup(self)
+ return {'RUNNING_MODAL'}
+
+ def execute(self, context):
+ print("op_id:", self.op_id)
+ 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'}
+ op('INVOKE_DEFAULT', module_name=self.module_name)
+
+class UI_OT_i18n_addon_translation_update(bpy.types.Operator):
+ """Update given addon's translation data (found as a py tuple in the addon's source code)"""
+ bl_idname = "ui.i18n_addon_translation_update"
+ bl_label = "Update I18n Addon"
+
+ module_name = EnumProperty(items=enum_addons, name="Addon", description="Addon to process", options=set())
+
+ __enum_addons_cache = []
+
+ def execute(self, context):
+ if not hasattr(self, "settings"):
+ self.settings = settings.settings
+ i18n_sett = context.window_manager.i18n_update_svn_settings
+
+ module_name, mod = validate_module(self, context)
+
+ # Generate addon-specific messages (no need for another blender instance here, this should not have any
+ # influence over the final result).
+ pot = bl_extract_messages.dump_addon_messages(module_name, True, self.settings)
+
+ # Now (try do) get current i18n data from the addon...
+ path = mod.__file__
+ if path.endswith("__init__.py"):
+ path = os.path.dirname(path)
+
+ trans = utils_i18n.I18n(kind='PY', src=path, settings=self.settings)
+
+ uids = set()
+ for lng in i18n_sett.langs:
+ if lng.uid in self.settings.IMPORT_LANGUAGES_SKIP:
+ print("Skipping {} language ({}), edit settings if you want to enable it.".format(lng.name, lng.uid))
+ continue
+ if not lng.use:
+ print("Skipping {} language ({}).".format(lng.name, lng.uid))
+ continue
+ uids.add(lng.uid)
+ # For now, add to processed uids all those not found in "official" list, minus "tech" ones.
+ uids |= (trans.trans.keys() - {lng.uid for lng in i18n_sett.langs} -
+ {self.settings.PARSER_TEMPLATE_ID, self.settings.PARSER_PY_ID})
+
+ # And merge!
+ for uid in uids:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list