Translation Update
Translation System now works!
This commit is contained in:
+5
-3
@@ -19,14 +19,16 @@ def register():
|
|||||||
properties.register()
|
properties.register()
|
||||||
# Order the classes before registration
|
# Order the classes before registration
|
||||||
core.register.order_classes()
|
core.register.order_classes()
|
||||||
# Register the UI classes
|
# Register the properties
|
||||||
|
|
||||||
# Iterate over the classes to register and register them
|
|
||||||
core.register.register_properties()
|
core.register.register_properties()
|
||||||
|
# Register the UI classes
|
||||||
for cls in core.register.__bl_ordered_classes:
|
for cls in core.register.__bl_ordered_classes:
|
||||||
print("registering " + str(cls))
|
print("registering " + str(cls))
|
||||||
bpy.utils.register_class(cls)
|
bpy.utils.register_class(cls)
|
||||||
|
|
||||||
|
# Load the translations after everything else is registered
|
||||||
|
functions.translations.load_translations()
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
print("Unregistering Avatar Toolkit")
|
print("Unregistering Avatar Toolkit")
|
||||||
# Unregister the UI classes
|
# Unregister the UI classes
|
||||||
|
|||||||
@@ -5,13 +5,14 @@ from .common import get_armature
|
|||||||
from bpy.types import Object, ShapeKey, Mesh, Context, Operator
|
from bpy.types import Object, ShapeKey, Mesh, Context, Operator
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from ..core.register import register_wrap
|
from ..core.register import register_wrap
|
||||||
|
from ..functions.translations import t
|
||||||
|
|
||||||
|
|
||||||
@register_wrap
|
@register_wrap
|
||||||
class ExportResonite(Operator):
|
class ExportResonite(Operator):
|
||||||
bl_idname = 'avatar_toolkit.export_resonite'
|
bl_idname = 'avatar_toolkit.export_resonite'
|
||||||
bl_label = "Export to Resonite"
|
bl_label = t("Export.resonite.label")
|
||||||
bl_description = "Export a GLB with all animations and materials. For animation data see: "
|
bl_description = t("Export.resonite.desc")
|
||||||
bl_options = {'REGISTER', 'UNDO'}
|
bl_options = {'REGISTER', 'UNDO'}
|
||||||
filepath: bpy.props.StringProperty()
|
filepath: bpy.props.StringProperty()
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -3,13 +3,14 @@ from ..functions.translations import t, get_languages_list, update_ui
|
|||||||
from ..core.register import register_property
|
from ..core.register import register_property
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
def register() -> None:
|
def register():
|
||||||
register_property((bpy.types.Scene, "language", bpy.props.EnumProperty(
|
register_property((bpy.types.Scene, "avatar_toolkit_language", bpy.props.EnumProperty(
|
||||||
name=t("Settings.language.label"),
|
name=t("Settings.language.label"),
|
||||||
description=t("Settings.language.desc"),
|
description=t("Settings.language.desc"),
|
||||||
items=get_languages_list,
|
items=get_languages_list,
|
||||||
|
default=0,
|
||||||
update=update_ui
|
update=update_ui
|
||||||
)))
|
)))
|
||||||
|
|
||||||
def unregister() -> None:
|
def unregister():
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from typing import List, Tuple, Optional
|
|||||||
from bpy.types import Material, Operator, Context, Object
|
from bpy.types import Material, Operator, Context, Object
|
||||||
from ..core.common import clean_material_names
|
from ..core.common import clean_material_names
|
||||||
from ..core.register import register_wrap
|
from ..core.register import register_wrap
|
||||||
|
from ..functions.translations import t
|
||||||
|
|
||||||
def textures_match(tex1: bpy.types.ImageTexture, tex2: bpy.types.ImageTexture) -> bool:
|
def textures_match(tex1: bpy.types.ImageTexture, tex2: bpy.types.ImageTexture) -> bool:
|
||||||
return tex1.image == tex2.image and tex1.extension == tex2.extension
|
return tex1.image == tex2.image and tex1.extension == tex2.extension
|
||||||
@@ -58,8 +59,8 @@ def report_consolidated(self: Operator, num_combined: int) -> None:
|
|||||||
@register_wrap
|
@register_wrap
|
||||||
class CombineMaterials(Operator):
|
class CombineMaterials(Operator):
|
||||||
bl_idname = "avatar_toolkit.combine_materials"
|
bl_idname = "avatar_toolkit.combine_materials"
|
||||||
bl_label = "Combine Materials"
|
bl_label = t("Optimization.combinematerials.label")
|
||||||
bl_description = "Combine similar materials to optimize the model"
|
bl_description = t("Optimization.combinematerials.desc")
|
||||||
bl_options = {'REGISTER', 'UNDO'}
|
bl_options = {'REGISTER', 'UNDO'}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -19,10 +19,28 @@ def load_translations() -> None:
|
|||||||
dictionary = dict()
|
dictionary = dict()
|
||||||
languages = ["auto"]
|
languages = ["auto"]
|
||||||
|
|
||||||
language: str = bpy.context.preferences.view.language
|
# Populate languages list
|
||||||
|
|
||||||
for i in os.listdir(translations_dir):
|
for i in os.listdir(translations_dir):
|
||||||
languages.append(i.split(".")[0])
|
lang = i.split(".")[0]
|
||||||
|
if lang != "auto":
|
||||||
|
languages.append(lang)
|
||||||
|
|
||||||
|
# Check if the context and scene are available
|
||||||
|
if hasattr(bpy.context, "scene"):
|
||||||
|
# Check if the property exists before trying to access it
|
||||||
|
if hasattr(bpy.context.scene, "avatar_toolkit_language"):
|
||||||
|
language_index = bpy.context.scene.avatar_toolkit_language
|
||||||
|
if isinstance(language_index, str):
|
||||||
|
language_index = int(language_index)
|
||||||
|
if language_index == 0: # "auto"
|
||||||
|
language = bpy.context.preferences.view.language
|
||||||
|
else:
|
||||||
|
language = languages[language_index]
|
||||||
|
else:
|
||||||
|
language = bpy.context.preferences.view.language
|
||||||
|
else:
|
||||||
|
# Set a default language if the context or scene is not available
|
||||||
|
language = "en_US"
|
||||||
|
|
||||||
translation_file: str = os.path.join(translations_dir, language + ".json")
|
translation_file: str = os.path.join(translations_dir, language + ".json")
|
||||||
if os.path.exists(translation_file):
|
if os.path.exists(translation_file):
|
||||||
@@ -52,13 +70,23 @@ def t(phrase: str, *args, **kwargs) -> str:
|
|||||||
return output.format(*args, **kwargs)
|
return output.format(*args, **kwargs)
|
||||||
|
|
||||||
def get_languages_list(self, context) -> List[Tuple[str, str, str]]:
|
def get_languages_list(self, context) -> List[Tuple[str, str, str]]:
|
||||||
choices: List[Tuple[str, str, str]] = []
|
return [(str(i), lang, f"Use {lang} language") for i, lang in enumerate(languages)]
|
||||||
for language in languages:
|
|
||||||
choices.append((language, language, language))
|
|
||||||
return choices
|
|
||||||
|
|
||||||
def update_ui(self, context) -> None:
|
def refresh_translations():
|
||||||
load_translations()
|
load_translations()
|
||||||
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
|
# Force a full UI update
|
||||||
|
for window in bpy.context.window_manager.windows:
|
||||||
|
for area in window.screen.areas:
|
||||||
|
area.tag_redraw()
|
||||||
|
|
||||||
|
def update_ui(self, context):
|
||||||
|
refresh_translations()
|
||||||
|
# Force Blender to redraw all UI elements
|
||||||
|
for screen in bpy.data.screens:
|
||||||
|
for area in screen.areas:
|
||||||
|
area.tag_redraw()
|
||||||
|
# Update the Scene to trigger a full UI refresh
|
||||||
|
bpy.context.scene.update_tag()
|
||||||
|
|
||||||
|
# Initial load of translations
|
||||||
load_translations()
|
load_translations()
|
||||||
|
|||||||
@@ -2,7 +2,17 @@
|
|||||||
"messages": {
|
"messages": {
|
||||||
"Settings.label": "Settings",
|
"Settings.label": "Settings",
|
||||||
"Settings.language.label": "Language",
|
"Settings.language.label": "Language",
|
||||||
"Settings.language.desc": "Select the language for the addon's UI"
|
"Settings.language.desc": "Select the language for the addon's UI",
|
||||||
|
"Export.resonite.label": "Export to Resonite",
|
||||||
|
"Export.resonite.desc": "Export a GLB with all animations and materials. For animation data see:",
|
||||||
|
"Optimization.combinematerials.label": "Combine Materials",
|
||||||
|
"Optimization.combinematerials.desc": "Combine similar materials to optimize the model",
|
||||||
|
"QuickAccess.label": "Quick Access",
|
||||||
|
"QuickAcess.importexport.txt": "Import/Export",
|
||||||
|
"QuickAccess.options": "Quick Access Options",
|
||||||
|
"QuickAccess.importexport.txt": "Import/Export",
|
||||||
|
"QuickAccess.import": "Import",
|
||||||
|
"QuickAccess.export": "Export"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,17 @@
|
|||||||
{
|
{
|
||||||
"messages": {
|
"messages": {
|
||||||
"Settings.label": "Settings Ja Test",
|
"Settings.label": "設定",
|
||||||
"Settings.language.label": "Language Ja Test",
|
"Settings.language.label": "言語",
|
||||||
"Settings.language.desc": "Select the language for the addon's UI Ja Test"
|
"Settings.language.desc": "アドオンのUI言語を選択してください",
|
||||||
|
"Export.resonite.label": "Resoniteにエクスポート",
|
||||||
|
"Export.resonite.desc": "すべてのアニメーションとマテリアルを含むGLBをエクスポートします。アニメーションデータについては以下を参照してください:",
|
||||||
|
"Optimization.combinematerials.label": "マテリアルを結合",
|
||||||
|
"Optimization.combinematerials.desc": "類似したマテリアルを結合してモデルを最適化します",
|
||||||
|
"QuickAccess.label": "クイックアクセス",
|
||||||
|
"QuickAcess.importexport.txt": "インポート/エクスポート",
|
||||||
|
"QuickAccess.options": "クイックアクセスオプション",
|
||||||
|
"QuickAccess.importexport.txt": "インポート/エクスポート",
|
||||||
|
"QuickAccess.import": "インポート",
|
||||||
|
"QuickAccess.export": "エクスポート"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+6
-5
@@ -2,13 +2,14 @@ import bpy
|
|||||||
from ..core.register import register_wrap
|
from ..core.register import register_wrap
|
||||||
from .panel import AvatarToolkitPanel
|
from .panel import AvatarToolkitPanel
|
||||||
from bpy.types import Context
|
from bpy.types import Context
|
||||||
|
from ..functions.translations import t
|
||||||
|
|
||||||
from ..core.import_pmx import import_pmx
|
from ..core.import_pmx import import_pmx
|
||||||
from ..core.import_pmd import import_pmd
|
from ..core.import_pmd import import_pmd
|
||||||
|
|
||||||
@register_wrap
|
@register_wrap
|
||||||
class AvatarToolkitQuickAccessPanel(bpy.types.Panel):
|
class AvatarToolkitQuickAccessPanel(bpy.types.Panel):
|
||||||
bl_label = "Quick Access"
|
bl_label = t("QuickAccesslabel")
|
||||||
bl_idname = "OBJECT_PT_avatar_toolkit_quick_access"
|
bl_idname = "OBJECT_PT_avatar_toolkit_quick_access"
|
||||||
bl_space_type = 'VIEW_3D'
|
bl_space_type = 'VIEW_3D'
|
||||||
bl_region_type = 'UI'
|
bl_region_type = 'UI'
|
||||||
@@ -17,17 +18,17 @@ class AvatarToolkitQuickAccessPanel(bpy.types.Panel):
|
|||||||
|
|
||||||
def draw(self, context: Context):
|
def draw(self, context: Context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
layout.label(text="Quick Access Options")
|
layout.label(text=t("QuickAccess.options"))
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.label(text="Import/Export", icon='IMPORT')
|
row.label(text=t("QuickAccess.importexport.txt"), icon='IMPORT')
|
||||||
|
|
||||||
layout.separator(factor=0.5)
|
layout.separator(factor=0.5)
|
||||||
|
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.scale_y = 1.5
|
row.scale_y = 1.5
|
||||||
row.operator("avatar_toolkit.import_menu", text="Import")
|
row.operator("avatar_toolkit.import_menu", text=t("QuickAccess.import"))
|
||||||
row.operator("avatar_toolkit.export_menu", text="Export")
|
row.operator("avatar_toolkit.export_menu", text=t("QuickAccess.export"))
|
||||||
|
|
||||||
@register_wrap
|
@register_wrap
|
||||||
class AVATAR_TOOLKIT_OT_import_menu(bpy.types.Operator):
|
class AVATAR_TOOLKIT_OT_import_menu(bpy.types.Operator):
|
||||||
|
|||||||
+1
-3
@@ -14,6 +14,4 @@ class AvatarToolkitSettingsPanel(bpy.types.Panel):
|
|||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
props = context.scene
|
layout.prop(context.scene, "avatar_toolkit_language", text=t("Settings.language.label"))
|
||||||
|
|
||||||
layout.prop(props, "language")
|
|
||||||
|
|||||||
Reference in New Issue
Block a user