Skip to content

Commit 0bf7362

Browse files
committed
Feat: add translation.py
1 parent 12654e5 commit 0bf7362

File tree

9 files changed

+221
-38
lines changed

9 files changed

+221
-38
lines changed

keymap.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import bpy
2+
3+
from mathutils import Vector, Euler, Matrix
4+
5+
6+
def get_keymap(keymap_name) -> "bpy.types.KeyMap":
7+
kc = bpy.context.window_manager.keyconfigs
8+
addon = kc.addon
9+
keymap = kc.default.keymaps.get(keymap_name, None)
10+
return addon.keymaps.new(
11+
keymap_name,
12+
space_type=keymap.space_type,
13+
region_type=keymap.region_type
14+
)
15+
16+
17+
def get_kmi_operator_properties(kmi: 'bpy.types.KeyMapItem') -> dict:
18+
"""获取kmi操作符的属性"""
19+
properties = kmi.properties
20+
prop_keys = dict(properties.items()).keys()
21+
dictionary = {i: getattr(properties, i, None) for i in prop_keys}
22+
del_key = []
23+
for item in dictionary:
24+
prop = getattr(properties, item, None)
25+
typ = type(prop)
26+
if prop:
27+
if typ == Vector:
28+
# 属性阵列-浮点数组
29+
dictionary[item] = dictionary[item].to_tuple()
30+
elif typ == Euler:
31+
dictionary[item] = dictionary[item][:]
32+
elif typ == Matrix:
33+
dictionary[item] = tuple(i[:] for i in dictionary[item])
34+
elif typ == bpy.types.bpy_prop_array:
35+
dictionary[item] = dictionary[item][:]
36+
elif typ in (str, bool, float, int, set, list, tuple):
37+
...
38+
elif typ.__name__ in [
39+
'TRANSFORM_OT_shrink_fatten',
40+
'TRANSFORM_OT_translate',
41+
'TRANSFORM_OT_edge_slide',
42+
'NLA_OT_duplicate',
43+
'ACTION_OT_duplicate',
44+
'GRAPH_OT_duplicate',
45+
'TRANSFORM_OT_translate',
46+
'OBJECT_OT_duplicate',
47+
'MESH_OT_loopcut',
48+
'MESH_OT_rip_edge',
49+
'MESH_OT_rip',
50+
'MESH_OT_duplicate',
51+
'MESH_OT_offset_edge_loops',
52+
'MESH_OT_extrude_faces_indiv',
53+
]: # 一些奇怪的操作符属性,不太好解析也用不上
54+
...
55+
del_key.append(item)
56+
else:
57+
print('emm 未知属性,', typ, dictionary[item])
58+
del_key.append(item)
59+
for i in del_key:
60+
dictionary.pop(i)
61+
return dictionary
62+
63+
64+
def draw_key(layout: bpy.types.UILayout):
65+
"""在偏好设置绘制插件快捷键"""
66+
import rna_keymap_ui
67+
from .tool.development_key import register_keymap_items
68+
69+
kc = bpy.context.window_manager.keyconfigs.user
70+
71+
for km, kmi in register_keymap_items:
72+
kmm = kc.keymaps.get(km.name)
73+
if kmm:
74+
is_find = False
75+
for kmii in kmm.keymap_items:
76+
if kmi.idname == kmii.idname:
77+
if get_kmi_operator_properties(kmi) == get_kmi_operator_properties(kmii):
78+
col = layout.column(align=True)
79+
if (not kmii.is_user_defined) and kmii.is_user_modified:
80+
col.context_pointer_set("keymap", kmm)
81+
is_find = True
82+
rna_keymap_ui.draw_kmi(["ADDON", "USER", "DEFAULT"], kc, kmm, kmii, col, 0)
83+
break # 找到了,但有可能会找到多个
84+
if not is_find:
85+
column = layout.column(align=True)
86+
column.label(text="Not Found Keymap, Please check the shortcut keys that have been changed")
87+
draw_restore_keymap_button(column)

preferences.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,46 +14,42 @@ class ToolPreferences(bpy.types.AddonPreferences, AutoReloadScriptPreferences):
1414

1515
activate_auto_reload_script: bpy.props.BoolProperty(
1616
default=True,
17-
name="ReLoad Script Tool",
18-
description="",
17+
name="ReLoad Script",
18+
description="Automatically reload scripts and run them",
1919
update=update_by_tool_name("auto_reload_script"),
2020
)
2121

2222
activate_development_key: bpy.props.BoolProperty(
2323
default=True,
24-
name="Development Key",
25-
description="alt+Space Toggle Full Screen"
26-
"ctrl+alt+MiddleMouse Show Console"
27-
"ctrl+alt+RightMouse Switch User Translate Interface"
28-
"ctrl+alt+AccentGrave Save Home File",
24+
name="Development Keymap",
25+
description="Commonly used Keymaps to speed up the development process",
2926
update=update_by_tool_name("development_key"),
3027
)
3128

3229
activate_open_addon_script: bpy.props.BoolProperty(
3330
default=False,
34-
name="Feat Open Addon Script or Folder",
35-
description="Rewrite the drawing method of the addon section,"
36-
" and display it in the expansion of the addon",
31+
name="Addon Open",
32+
description="Rewrite the drawing method of the addon section, and display it in the expansion of the addon",
3733
update=update_by_tool_name("open_addon_script")
3834
)
3935
activate_remember_addon_expanded: bpy.props.BoolProperty(
4036
default=True,
4137
name="Remember addon expanded",
42-
description="",
38+
description="Record the expanded Addon and restore it the next time you open Blender",
4339
update=update_by_tool_name("remember_addon_expanded"),
4440
)
4541

4642
activate_remember_addon_search: bpy.props.BoolProperty(
4743
default=True,
4844
name="Remember addon search",
49-
description="",
45+
description="Record the Addon search and restore it the next time you start Blender",
5046
update=update_by_tool_name("remember_addon_search"),
5147
)
5248

5349
activate_restart_blender: bpy.props.BoolProperty(
5450
default=True,
5551
name="Restart Blender",
56-
description="Enabled Multiple Blender,or Restart Blender",
52+
description="Enable multiple Blenders or restart Blender, please be careful to save the edit file!!!!",
5753
update=update_by_tool_name("restart_blender"),
5854
)
5955

@@ -62,10 +58,24 @@ class ToolPreferences(bpy.types.AddonPreferences, AutoReloadScriptPreferences):
6258
addon_search: bpy.props.StringProperty(default="")
6359

6460
def draw(self, context):
61+
from .keymap import draw_key
62+
6563
column = self.layout.column(align=True)
6664
for prop in self.bl_rna.properties:
6765
if prop.identifier.startswith("activate_"):
68-
column.prop(self, prop.identifier)
66+
self.draw_prop(column, prop.identifier)
67+
68+
if self.activate_development_key:
69+
column.separator()
70+
col = column.box().column(align=True)
71+
col.label(text="Keymap")
72+
draw_key(col)
73+
74+
def draw_prop(self, layout, identifier) -> None:
75+
split = layout.row(align=True).split(factor=.2, align=True)
76+
prop = self.bl_rna.properties[identifier]
77+
split.prop(self, identifier, toggle=True, expand=True)
78+
split.label(text=prop.description)
6979

7080

7181
def register():

registration.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from . import preferences
22
from . import tool
3+
from . import translation
34
from .tool.remember_addon_expanded import restore_addons_expanded
45
from .tool.remember_addon_search import restore_addon_search
56
from .utils import clear_cache
@@ -27,9 +28,11 @@ def register():
2728

2829
restore_addon_search()
2930
restore_addons_expanded()
31+
translation.register()
3032

3133

3234
def unregister():
3335
clear_cache()
3436
tool.unregister()
3537
preferences.unregister()
38+
translation.unregister()

tool/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def update(self, context):
4242
for tool in tool_mods:
4343
name = tool.__name__.split(".")[-1]
4444
if name == tool_name:
45-
print("udpate_tool", name, tool)
4645
if prop:
4746
tool.register()
4847
elif prop is False:

tool/development_key.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ..utils import get_keymap
1+
from ..keymap import get_keymap
22

33
register_keymap_items = []
44

tool/remember_addon_expanded.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ def remember_addons_expanded():
2323

2424
bpy.ops.wm.save_userpref()
2525

26-
expanded_list = [addon.name for addon in pref.addon_show_expanded if addon.show_expanded]
27-
print("remember_addons_expanded", expanded_list)
28-
2926

3027
def restore_addons_expanded():
3128
def restore():
@@ -34,7 +31,6 @@ def restore():
3431
if pref.activate_remember_addon_expanded:
3532
expanded_list = [addon.name for addon in pref.addon_show_expanded if addon.show_expanded]
3633

37-
print("expanded_list", expanded_list)
3834
import addon_utils
3935
addon_utils.modules_refresh()
4036
for key in addon_keys():

tool/restart_blender.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,22 @@ class RestartBlender(
1919
bl_idname = "wm.restart_blender"
2020
bl_label = "Restart Blender"
2121
bl_description = """
22-
Left - Open a New Blender
23-
24-
alt+Left -Prompt to save file, Restart blender
25-
ctrl+Left - Do not prompt to save files, Restart Blender
26-
shift+Left - Open Tow Blender
27-
28-
ctrl+alt+shift+Left Loop Open Blender, dedicated for explosion"""
22+
"""
2923
bl_options = {"REGISTER"}
3024

25+
@classmethod
26+
def description(cls, context, properties):
27+
from ..translation import translate_lines_text
28+
return translate_lines_text(
29+
"",
30+
"Click Open a New Blender",
31+
"Alt Prompt to save file, Restart Blender",
32+
"Ctrl Do not prompt to save files, Restart Blender",
33+
"Shift Open Tow Blender",
34+
"",
35+
"Ctrl+Alt+Shift Loop Open Blender, dedicated for explosion",
36+
)
37+
3138
open_blender_number: bpy.props.IntProperty(
3239
name="Open Blender Number",
3340
default=20,

translation.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import ast
2+
import re
3+
4+
import bpy
5+
6+
zh_HANS = {
7+
"Automatically reload scripts and run them": "自动重载脚本并运行",
8+
"ReLoad Script": "重载脚本",
9+
"Development Keymap": "开发快捷键",
10+
"Commonly used Keymaps to speed up the development process": "常用可以加快开发流程的快捷键",
11+
"Addon Open": "打开插件",
12+
"Rewrite the drawing method of the addon section, and display it in the expansion of the addon": "重写插件部分的绘制方法,并在插件的扩展是显示打开脚本文件与文件夹按钮",
13+
"Remember addon expanded": "记住插件展开",
14+
"Record the expanded Addon and restore it the next time you open Blender": "将已展开的插件记录下来,在下次打开Blender时恢复",
15+
"Remember addon search": "记住插件搜索",
16+
"Record the Addon search and restore it the next time you start Blender": "将插件搜索记录下来,在下次启动Blender时恢复",
17+
"Restart Blender": "重启Blender",
18+
"Enable multiple Blenders or restart Blender, please be careful to save the edit file!!!!": "启用多个Blender或重启Blender,请注意保存编辑文件!!!!",
19+
"Keymap": "快捷键",
20+
"Click Open a New Blender": "左键 打开一个新的Blender",
21+
"Alt Prompt to save file, Restart Blender": "Alt 提示保存文件,重启Blender",
22+
"Ctrl Do not prompt to save files, Restart Blender": "Ctrl 不提示保存文件,重启Blender",
23+
"Shift Open Tow Blender": "Shift 打开两个Blender",
24+
"Ctrl+Alt+Shift Loop Open Blender, dedicated for explosion": "Ctrl+Alt+Shift 循环打开Blender,爆炸专用",
25+
}
26+
27+
28+
def translate_lines_text(*args, split="\n"):
29+
from bpy.app.translations import pgettext_iface
30+
return split.join([pgettext_iface(line) for line in args])
31+
32+
33+
def get_language_list() -> list:
34+
"""
35+
Traceback (most recent call last):
36+
File "<blender_console>", line 1, in <module>
37+
TypeError: bpy_struct: item.attr = val: enum "a" not found in ("DEFAULT", "en_US", "es", "ja_JP", "sk_SK", "vi_VN", "zh_HANS", "ar_EG", "de_DE", "fr_FR", "it_IT", "ko_KR", "pt_BR", "pt_PT", "ru_RU", "uk_UA", "zh_TW", "ab", "ca_AD", "cs_CZ", "eo", "eu_EU", "fa_IR", "ha", "he_IL", "hi_IN", "hr_HR", "hu_HU", "id_ID", "ky_KG", "nl_NL", "pl_PL", "sr_RS", "sr_RS@latin", "sv_SE", "th_TH", "tr_TR")
38+
"""
39+
try:
40+
bpy.context.preferences.view.language = ""
41+
except TypeError as e:
42+
matches = re.findall(r"\(([^()]*)\)", e.args[-1])
43+
return ast.literal_eval(f"({matches[-1]})")
44+
45+
46+
class TranslationHelper:
47+
def __init__(self, name: str, data: dict, lang='zh_CN'):
48+
self.name = name
49+
self.translations_dict = dict()
50+
51+
for src, src_trans in data.items():
52+
key = ("Operator", src)
53+
self.translations_dict.setdefault(lang, {})[key] = src_trans
54+
key = ("*", src)
55+
self.translations_dict.setdefault(lang, {})[key] = src_trans
56+
key = (name, src)
57+
self.translations_dict.setdefault(lang, {})[key] = src_trans
58+
59+
def register(self):
60+
try:
61+
bpy.app.translations.register(self.name, self.translations_dict)
62+
except(ValueError):
63+
pass
64+
65+
def unregister(self):
66+
bpy.app.translations.unregister(self.name)
67+
68+
69+
# Set
70+
############
71+
72+
all_language = get_language_list()
73+
74+
zh_CN = None
75+
76+
77+
def register():
78+
global zh_CN
79+
80+
language = "zh_CN"
81+
if language not in all_language:
82+
if language in ("zh_CN", "zh_HANS"):
83+
if "zh_CN" in all_language:
84+
language = "zh_CN"
85+
elif "zh_HANS" in all_language:
86+
language = "zh_HANS"
87+
zh_CN = TranslationHelper('development_kit_zh_CN', zh_HANS, lang=language)
88+
zh_CN.register()
89+
90+
91+
def unregister():
92+
zh_CN.unregister()

utils.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,6 @@ def get_event_key(event: bpy.types.Event):
2828
return not_key, only_ctrl, only_alt, only_shift, shift_alt, ctrl_alt, ctrl_shift, ctrl_shift_alt
2929

3030

31-
def get_keymap(keymap_name) -> "bpy.types.KeyMap":
32-
kc = bpy.context.window_manager.keyconfigs
33-
addon = kc.addon
34-
keymap = kc.default.keymaps.get(keymap_name, None)
35-
return addon.keymaps.new(
36-
keymap_name,
37-
space_type=keymap.space_type,
38-
region_type=keymap.region_type
39-
)
40-
41-
4231
def tag_redraw():
4332
for area in bpy.context.screen.areas:
4433
area.tag_redraw()

0 commit comments

Comments
 (0)