更改 ProBuilber 插件(二):给 Text Mode 添加汉化

本文详细介绍了如何使用反射和字典映射技术,对Unity的ProBuilder插件进行汉化,包括菜单标题和概要的翻译过程。
书接上回,继续给 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链接
.待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值