书接上回,继续给
Text Mode
加上中文。
一、定位
老规矩,首先要确认需要修改的地方。
①、
通过一个简单的查找,
很不幸的,开发者似乎还没考虑过翻译的事,直接在属性中写死了文本。 如果一个个脚本翻开去添加和修改,很显然是很不划算的。 所以,只能考虑在调用
menuTitle
的地方套个文本转化的方法了。
②、
回到实现绘制
Button
的地方,也就是
MenuAction
类中。 这就是要修改的地方了,上一篇已经动过刀子的地方。
GUIContent
guiContent
=
new
GUIContent
(
menuTitle
,
buttonEnabled
||
!
disabledIcon
?
icon
:
disabledIcon
)
;
if
(
GUILayout
.
Button
(
guiContent
,
MenuActionStyles
.
buttonStyleVertical
)
)
..
.
不过,还有需要注意的是,其他地方也可能调用过
menuTitle
属性。 为安全起见,还是检索一下, 不出所料,在
GetSize(...)
方法中也被调用过。
m_LastCalculatedSize
=
MenuActionStyles
.
buttonStyleVertical
.
CalcSize
(
UI
.
EditorGUIUtility
.
TempContent
(
menuTitle
)
)
+
AltButtonSize
;
这里会影响到按钮绘制的尺寸,所以也要修改。
二、改!
①、
按照上面的思路,先创建一个方法,大致是,
static
readonly
Dictionary
<
string
,
string
>
menuTitleDic
=
new
Dictionary
<
string
,
string
>
{
{
"menuTitle"
,
"汉化"
}
..
.
}
internal
string
TranslateMT
(
string
menuTitle
)
{
return
menuTitleDic
.
ContainsKey
(
menuTitle
)
?
menuTitleDic
[
menuTitle
]
:
menuTitle
;
}
那么问题来了,我们需要填写
menuTitleDic
的内容, 但总不能手动把
MenuAction
的所有子类翻一遍把。
②、
这时候就需要使用屡试不爽的反射了。
[
MenuItem
(
"Test/PrintMenuActionChild"
)
]
static
void
PrintMenuActionChild
(
)
{
Assembly
assembly
=
Assembly
.
Load
(
"Unity.ProBuilder.Editor"
)
;
PropertyInfo
pMenuTitle
=
typeof
(
MenuAction
)
.
GetProperty
(
"menuTitle"
)
;
string
s
=
""
;
foreach
(
var
item
in
assembly
.
GetTypes
(
)
)
if
(
item
.
IsSubclassOf
(
typeof
(
MenuAction
)
)
)
{
var
obj
=
assembly
.
CreateInstance
(
item
.
FullName
)
;
s
+=
"{\""
+
pMenuTitle
.
GetValue
(
obj
)
+
"\", \"\"},\n"
;
}
Debug
.
Log
(
s
)
;
}
得到下面内容之后,就可以着手翻译了。
③、
需要注意的。 一是,表中居然存在重复内容,需要去一下重。 二是,发现了一些拼接内容,如: "Rect: Intersect"、"Shift: Difference"、"Orientation: Local"、"Select Hidden: Off" 需要稍微翻一下脚本,进行补全。
④、
翻译完成后就可以添加到
menuTitleDic
字典中了,
static
readonly
Dictionary
<
string
,
string
>
menuTitleDic
=
new
Dictionary
<
string
,
string
>
{
{
"New Bezier Shape"
,
"创建贝塞尔模型"
}
,
{
"New Poly Shape"
,
"创建多边形模型"
}
,
{
"Lightmap UV Editor"
,
"光照UV编辑"
}
,
..
.
}
当然,我也就图省事,直接写在了脚本中, 如果不嫌麻烦,可以单独创建一个资源存放翻译数据,再读进来。
⑤、
翻译工作完成了,可别忘了给上面需要转换的两处套上方法。
TranslateMT
(
menuTitle
)
这样就大功告成了。 本该是这样的,西卡西……
三、在加点吧
麦扣居然在上一篇评论了,还惊讶我做了汉化😂, 虽然我没想过做全套,也没想过集成自动翻译功能,但也不能太拉跨,于是打算把概要也翻译一下。 又一顿操作后,在
TooltipContent
类中,修改了下面代码,
//public string summary { get; set; }
public
string
summary
{
get
{
return
GetSummary
(
)
;
}
set
{
summaryOir
=
value
;
}
}
public
string
summaryOir
;
internal
string
GetSummary
(
)
{
return
summaryDic
.
ContainsKey
(
title
)
?
summaryDic
[
title
]
:
summaryOir
;
}
static
readonly
Dictionary
<
string
,
string
>
summaryDic
=
new
Dictionary
<
string
,
string
>
{
..
.
}
;
呼~
附、
插件先传了一份在 GitHub 上,欢迎自取 -
GitHub链接
.待续
本文详细介绍了如何使用反射和字典映射技术,对Unity的ProBuilder插件进行汉化,包括菜单标题和概要的翻译过程。

被折叠的 条评论
为什么被折叠?



