Translation Update

Translation System now works!
This commit is contained in:
Yusarina
2024-07-05 13:01:59 +01:00
parent 0658e3a86f
commit ce9cc9684f
9 changed files with 86 additions and 35 deletions
+5 -3
View File
@@ -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
+3 -2
View File
@@ -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
View File
@@ -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
+3 -2
View File
@@ -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
+37 -9
View File
@@ -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()
+11 -1
View File
@@ -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"
} }
} }
+14 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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")