feat: add i18n for forgetten entries.

- add i18n for progress hints when importing or exporting virtools file.
- add i18n for naming convention report.
This commit is contained in:
yyc12345 2025-01-19 10:52:20 +08:00
parent f9fe4af1fe
commit cc74a2ca8b
3 changed files with 74 additions and 33 deletions

View File

@ -133,7 +133,8 @@ def _prepare_virtools_3dobjects(
light_crets: list[_TLightPair] = [] light_crets: list[_TLightPair] = []
light_cret_set: set[bpy.types.Object] = set() light_cret_set: set[bpy.types.Object] = set()
# start saving # start saving
progress.enter_substeps(len(export_objects), "Creating 3dObjects and Lights") tr_text: str = bpy.app.translations.pgettext_rpt('Creating 3dObjects and Lights', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(export_objects), tr_text)
# iterate exported object list # iterate exported object list
for obj3d in export_objects: for obj3d in export_objects:
@ -176,7 +177,8 @@ def _export_virtools_groups(
# create virtools group # create virtools group
group_cret_map: dict[str, bmap.BMGroup] = {} group_cret_map: dict[str, bmap.BMGroup] = {}
# start saving # start saving
progress.enter_substeps(len(obj3d_crets), "Saving Groups") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Groups', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(obj3d_crets), tr_text)
# create sector group first if user ordered # create sector group first if user ordered
# This step is designed for ensure that the created sector group is successive. # This step is designed for ensure that the created sector group is successive.
@ -221,7 +223,8 @@ def _export_virtools_light(
light_crets: tuple[_TLightPair, ...] light_crets: tuple[_TLightPair, ...]
) -> None: ) -> None:
# start saving # start saving
progress.enter_substeps(len(light_crets), "Saving Lights") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Lights', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(light_crets), tr_text)
for obj3d, light, vtlight in light_crets: for obj3d, light, vtlight in light_crets:
# set name # set name
@ -268,7 +271,8 @@ def _export_virtools_3dobjects(
mesh_crets: list[_TMeshPair] = [] mesh_crets: list[_TMeshPair] = []
mesh_cret_map: dict[bpy.types.Mesh, bmap.BMMesh] = {} mesh_cret_map: dict[bpy.types.Mesh, bmap.BMMesh] = {}
# start saving # start saving
progress.enter_substeps(len(obj3d_crets), "Saving 3dObjects") tr_text: str = bpy.app.translations.pgettext_rpt('Saving 3dObjects', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(obj3d_crets), tr_text)
for obj3d, vtobj3d in obj3d_crets: for obj3d, vtobj3d in obj3d_crets:
# set name # set name
@ -314,7 +318,8 @@ def _export_virtools_meshes(
material_crets: list[_TMaterialPair] = [] material_crets: list[_TMaterialPair] = []
material_cret_map: dict[bpy.types.Material, bmap.BMMaterial] = {} material_cret_map: dict[bpy.types.Material, bmap.BMMaterial] = {}
# start saving # start saving
progress.enter_substeps(len(mesh_crets), "Saving Meshes") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Meshes', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(mesh_crets), tr_text)
# iterate meshes # iterate meshes
for obj3d, mesh, vtmesh in mesh_crets: for obj3d, mesh, vtmesh in mesh_crets:
@ -428,7 +433,8 @@ def _export_virtools_materials(
texture_crets: list[_TTexturePair] = [] texture_crets: list[_TTexturePair] = []
texture_cret_map: dict[bpy.types.Image, bmap.BMTexture] = {} texture_cret_map: dict[bpy.types.Image, bmap.BMTexture] = {}
# start saving # start saving
progress.enter_substeps(len(material_crets), "Saving Materials") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Materials', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(material_crets), tr_text)
for mtl, vtmaterial in material_crets: for mtl, vtmaterial in material_crets:
# set name # set name
@ -493,7 +499,8 @@ def _export_virtools_textures(
texture_crets: tuple[_TTexturePair, ...] texture_crets: tuple[_TTexturePair, ...]
) -> None: ) -> None:
# start saving # start saving
progress.enter_substeps(len(texture_crets), "Saving Textures") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Textures', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(len(texture_crets), tr_text)
for tex, vttexture in texture_crets: for tex, vttexture in texture_crets:
# set name # set name
@ -532,7 +539,8 @@ def _save_virtools_document(
compress_level: int compress_level: int
) -> None: ) -> None:
progress.enter_substeps(1, "Saving Document") tr_text: str = bpy.app.translations.pgettext_rpt('Saving Document', 'BBP_OT_export_virtools/execute')
progress.enter_substeps(1, tr_text)
writer.save(file_name, texture_save_opt, use_compress, compress_level) writer.save(file_name, texture_save_opt, use_compress, compress_level)
progress.step() progress.step()
progress.leave_substeps() progress.leave_substeps()

View File

@ -80,11 +80,13 @@ def _import_virtools_textures(
) -> dict[bmap.BMTexture, bpy.types.Image]: ) -> dict[bmap.BMTexture, bpy.types.Image]:
# create map # create map
texture_cret_map: dict[bmap.BMTexture, bpy.types.Image] = {} texture_cret_map: dict[bmap.BMTexture, bpy.types.Image] = {}
progress.enter_substeps(reader.get_texture_count(), "Loading Textures") # notify steps
tr_text: str = bpy.app.translations.pgettext_rpt('Loading Textures', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_texture_count(), tr_text)
# create another temp folder for raw data virtools texture importing # create another temp folder for raw data virtools texture importing
with tempfile.TemporaryDirectory() as rawdata_temp: with tempfile.TemporaryDirectory() as rawdata_temp:
tr_text: str = bpy.app.translations.pgettext_rpt( tr_text = bpy.app.translations.pgettext_rpt(
'Texture Raw Data Temporary Directory: {0}', 'BBP_OT_import_virtools/execute') 'Texture Raw Data Temporary Directory: {0}', 'BBP_OT_import_virtools/execute')
print(tr_text.format(rawdata_temp)) print(tr_text.format(rawdata_temp))
@ -148,7 +150,9 @@ def _import_virtools_materials(
) -> dict[bmap.BMMaterial, bpy.types.Material]: ) -> dict[bmap.BMMaterial, bpy.types.Material]:
# create map and prepare progress # create map and prepare progress
material_cret_map: dict[bmap.BMMaterial, bpy.types.Material] = {} material_cret_map: dict[bmap.BMMaterial, bpy.types.Material] = {}
progress.enter_substeps(reader.get_material_count(), "Loading Materials") # notify steps
tr_text: str = bpy.app.translations.pgettext_rpt('Loading Materials', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_material_count(), tr_text)
for vtmaterial in reader.get_materials(): for vtmaterial in reader.get_materials():
# create mtl # create mtl
@ -213,7 +217,9 @@ def _import_virtools_meshes(
) -> dict[bmap.BMMesh, bpy.types.Mesh]: ) -> dict[bmap.BMMesh, bpy.types.Mesh]:
# create map and prepare progress # create map and prepare progress
mesh_cret_map: dict[bmap.BMMesh, bpy.types.Mesh] = {} mesh_cret_map: dict[bmap.BMMesh, bpy.types.Mesh] = {}
progress.enter_substeps(reader.get_mesh_count(), "Loading Meshes") # notify steps
tr_text: str = bpy.app.translations.pgettext_rpt('Loading Meshes', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_mesh_count(), tr_text)
for vtmesh in reader.get_meshs(): for vtmesh in reader.get_meshs():
# create mesh # create mesh
@ -309,7 +315,9 @@ def _import_virtools_3dobjects(
) -> dict[bmap.BM3dObject, bpy.types.Object]: ) -> dict[bmap.BM3dObject, bpy.types.Object]:
# create map and prepare progress # create map and prepare progress
obj3d_cret_map: dict[bmap.BM3dObject, bpy.types.Object] = {} obj3d_cret_map: dict[bmap.BM3dObject, bpy.types.Object] = {}
progress.enter_substeps(reader.get_3dobject_count(), "Loading 3dObjects") # notify steps
tr_text: str = bpy.app.translations.pgettext_rpt('Loading 3dObjects', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_3dobject_count(), tr_text)
for vt3dobj in reader.get_3dobjects(): for vt3dobj in reader.get_3dobjects():
# get virtools binding mesh data first # get virtools binding mesh data first
@ -353,7 +361,8 @@ def _import_virtools_lights(
resolver: UTIL_ioport_shared.ConflictResolver resolver: UTIL_ioport_shared.ConflictResolver
) -> None: ) -> None:
# prepare progress # prepare progress
progress.enter_substeps(reader.get_target_light_count(), "Loading Lights") tr_text: str = bpy.app.translations.pgettext_rpt('Loading Lights', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_target_light_count(), tr_text)
# please note light is slightly different between virtools and blender. # please note light is slightly different between virtools and blender.
# in virtools, light is the sub class of 3d entity. # in virtools, light is the sub class of 3d entity.
@ -414,7 +423,8 @@ def _import_virtools_groups(
sector_count: int = 1 sector_count: int = 1
# prepare progress # prepare progress
progress.enter_substeps(reader.get_group_count(), "Loading Groups") tr_text: str = bpy.app.translations.pgettext_rpt('Loading Groups', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(reader.get_group_count(), tr_text)
for vtgroup in reader.get_groups(): for vtgroup in reader.get_groups():
# if this group do not have name, skip it # if this group do not have name, skip it
@ -449,7 +459,8 @@ def _import_virtools_groups(
progress.leave_substeps() progress.leave_substeps()
# now we can assign 3dobject group data by reverse map # now we can assign 3dobject group data by reverse map
progress.enter_substeps(len(reverse_map), "Applying Groups") tr_text: str = bpy.app.translations.pgettext_rpt('Applying Groups', 'BBP_OT_import_virtools/execute')
progress.enter_substeps(len(reverse_map), tr_text)
for mapk, mapv in reverse_map.items(): for mapk, mapv in reverse_map.items():
# check object # check object
assoc_obj = obj3d_cret_map.get(mapk, None) assoc_obj = obj3d_cret_map.get(mapk, None)

View File

@ -291,7 +291,9 @@ class VirtoolsGroupConvention():
int(regex_result.group(1)) int(regex_result.group(1))
) )
if reporter: reporter.add_error("PC_Checkpoints or PR_Resetpoints detected. But couldn't get sector from name.") tr_text: str = bpy.app.translations.pgettext_rpt(
"PC_Checkpoints or PR_Resetpoints detected. But couldn't get sector from name.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@staticmethod @staticmethod
@ -311,6 +313,9 @@ class VirtoolsGroupConvention():
@staticmethod @staticmethod
def parse_from_object(obj: bpy.types.Object, reporter: RenameErrorReporter | None) -> BallanceObjectInfo | None: def parse_from_object(obj: bpy.types.Object, reporter: RenameErrorReporter | None) -> BallanceObjectInfo | None:
# declare translation string type
tr_text: str
# create visitor # create visitor
with PROP_virtools_group.VirtoolsGroupsHelper(obj) as gp: with PROP_virtools_group.VirtoolsGroupsHelper(obj) as gp:
# if no group, we should consider it is decoration or skylayer # if no group, we should consider it is decoration or skylayer
@ -331,10 +336,14 @@ class VirtoolsGroupConvention():
# these type's data should be gotten from its name # these type's data should be gotten from its name
return VirtoolsGroupConvention.__get_pcpr_from_name(obj.name, reporter) return VirtoolsGroupConvention.__get_pcpr_from_name(obj.name, reporter)
case _: case _:
if reporter: reporter.add_error("The match of Unique Component lost.") tr_text = bpy.app.translations.pgettext_rpt(
"The match of Unique Component lost.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
elif len(inter_gps) != 0: elif len(inter_gps) != 0:
if reporter: reporter.add_error("A Multi-grouping Unique Component.") tr_text = bpy.app.translations.pgettext_rpt(
"A Multi-grouping Unique Component.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
# distinguish normal elements # distinguish normal elements
@ -346,7 +355,9 @@ class VirtoolsGroupConvention():
gotten_sector: int | None = VirtoolsGroupConvention.__get_sector_from_groups(gp.iterate_groups()) gotten_sector: int | None = VirtoolsGroupConvention.__get_sector_from_groups(gp.iterate_groups())
if gotten_sector is None: if gotten_sector is None:
# fail to get sector # fail to get sector
if reporter: reporter.add_error("Component detected. But couldn't get sector from CKGroup data.") tr_text = bpy.app.translations.pgettext_rpt(
"Component detected. But couldn't get sector from CKGroup data.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
return BallanceObjectInfo.create_from_component( return BallanceObjectInfo.create_from_component(
gotten_elements, gotten_elements,
@ -354,7 +365,9 @@ class VirtoolsGroupConvention():
) )
elif len(inter_gps) != 0: elif len(inter_gps) != 0:
# must be a weird grouping, report it # must be a weird grouping, report it
if reporter: reporter.add_error("A Multi-grouping Component.") tr_text = bpy.app.translations.pgettext_rpt(
"A Multi-grouping Component.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
# distinguish road # distinguish road
@ -370,7 +383,9 @@ class VirtoolsGroupConvention():
elif len(floor_result) == 0 and len(rail_result) > 0: elif len(floor_result) == 0 and len(rail_result) > 0:
return BallanceObjectInfo.create_from_others(BallanceObjectType.WOOD) return BallanceObjectInfo.create_from_others(BallanceObjectType.WOOD)
else: else:
if reporter: reporter.add_warning("Can't distinguish object between Floors and Rails. Suppose it is Floors.") tr_text = bpy.app.translations.pgettext_rpt(
"Can't distinguish object between Floors and Rails. Suppose it is Floors.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_warning(tr_text)
return BallanceObjectInfo.create_from_others(BallanceObjectType.FLOOR) return BallanceObjectInfo.create_from_others(BallanceObjectType.FLOOR)
elif gp.contain_group('Phys_FloorStopper'): elif gp.contain_group('Phys_FloorStopper'):
return BallanceObjectInfo.create_from_others(BallanceObjectType.STOPPER) return BallanceObjectInfo.create_from_others(BallanceObjectType.STOPPER)
@ -378,7 +393,9 @@ class VirtoolsGroupConvention():
return BallanceObjectInfo.create_from_others(BallanceObjectType.DEPTH_CUBE) return BallanceObjectInfo.create_from_others(BallanceObjectType.DEPTH_CUBE)
# no matched # no matched
if reporter: reporter.add_error("Group match lost.") tr_text = bpy.app.translations.pgettext_rpt(
"Group match lost.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@staticmethod @staticmethod
@ -427,8 +444,9 @@ class VirtoolsGroupConvention():
gp.add_group(build_name_from_sector_index(typing.cast(int, info.mSector))) gp.add_group(build_name_from_sector_index(typing.cast(int, info.mSector)))
case _: case _:
if reporter is not None: tr_text: str = bpy.app.translations.pgettext_rpt(
reporter.add_error('No matched info.') "No matched info.", 'BBP/UTIL_naming_convension.VirtoolsGroupConvention')
if reporter: reporter.add_error(tr_text)
return False return False
return True return True
@ -480,8 +498,9 @@ class YYCToolchainConvention():
if name == 'SkyLayer': if name == 'SkyLayer':
return BallanceObjectInfo.create_from_others(BallanceObjectType.SKYLAYER) return BallanceObjectInfo.create_from_others(BallanceObjectType.SKYLAYER)
if reporter is not None: tr_text: str = bpy.app.translations.pgettext_rpt(
reporter.add_error("Name match lost.") "Name match lost.", 'BBP/UTIL_naming_convension.YYCToolchainConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@ -523,8 +542,9 @@ class YYCToolchainConvention():
info.mComponentType, info.mSector) info.mComponentType, info.mSector)
case _: case _:
if reporter is not None: tr_text: str = bpy.app.translations.pgettext_rpt(
reporter.add_error('No matched info.') "No matched info.", 'BBP/UTIL_naming_convension.YYCToolchainConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@staticmethod @staticmethod
@ -586,8 +606,9 @@ class ImengyuConvention():
if name == 'SkyLayer': if name == 'SkyLayer':
return BallanceObjectInfo.create_from_others(BallanceObjectType.SKYLAYER) return BallanceObjectInfo.create_from_others(BallanceObjectType.SKYLAYER)
if reporter is not None: tr_text: str = bpy.app.translations.pgettext_rpt(
reporter.add_error("Name match lost.") "Name match lost.", 'BBP/UTIL_naming_convension.ImengyuConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@staticmethod @staticmethod
@ -631,8 +652,9 @@ class ImengyuConvention():
) )
case _: case _:
if reporter is not None: tr_text: str = bpy.app.translations.pgettext_rpt(
reporter.add_error('No matched info.') "No matched info.", 'BBP/UTIL_naming_convension.ImengyuConvention')
if reporter: reporter.add_error(tr_text)
return None return None
@staticmethod @staticmethod