首先是看到这篇博文:《WPF四年,尤不足以替代WinForm》其中就提到了WPF本地化的问题。其中是这么说的:
编译之后XAML会被编译成二进制的BAML,而BAML的格式是非公开的。这样就不能去改被引用的对象属性名。
然而,非公开的就一定无从知晓了吗?也许是时代进步了,那篇博文发布已经五年过去了,很多事实都已经发生了变化:WPF引入的XAML继续用于Windows应用、WindowsPhone甚至是Android、iOS(Xamarin)的开发、WPF本身的效率也在改进、界面效果完胜WinForm。然而说了这么多其实我也没少用WinForm……
总之,事实上现在BAML的格式已经不是一个秘密。通过解析BAML文件(甚至是直接解析.NET文件资源中的BAML流),我们可以做到直接基于BAML的汉化,就像广大汉化工作者汉化Win32或是Winform程序一样,并不需要源文件。
过程思路:
从.NET文件中取出资源
从资源文件中取出BAML文件(以上两步也可换为直接读取.NET文件并定位到资源的位置)
解析BAML文件
对BAML的相关条目(Record)进行更改
重新生成(写入)BAML文件
重新构建资源文件
用新的资源文件替换.NET文件中原有的资源文件
效果示例:
汉化前的某WPF程序。
上图是我写的BAML Translator。仅仅是一个简易的实现,仍然存在一些问题。
汉化后的效果。