UE引擎自带的本地化源码分析
研究背景
目前游戏厂商出海越来越多,UE引擎由于其对多平台的支持性较高,本地化相关工具也比较齐全,逐步成为游戏厂商开发游戏的首选。而在实际使用过程中,也发现了一些不方便的地方。希望研究一下,解决一些实际操作中遇到的痛点。
问题1 关于如何快速根据StringTable中的Key定位到使用该Key的场景
都知道,当我们进行本地化翻译的时候,实际的翻译人员很难确定文本的使用场景,而因此造成的翻译不准确也很难避免。而如何快速准确的根据文本查到其所在的StringTable和Key,再确定其使用的具体位置,就显得尤为重要。
直接说结论
- 在UE资产中,某些资产会在文件头缓存该文件的本地化信息,比如StringTable
- 在UE资产的文件头信息中,PackageFlags会标记该文件是否需要收集本地化信息
- 当资产中包含FText格式的内容且使用随机Key进行本地化时,资产会被标记为需要收集本地化信息
- 当引擎在进行GatherLocalization命令的时候,如果资产中已经包含了本地化信息(比如StringTable),则直接收集;如果资产没有包含本地化信息,且资产被标记为需要收集本地化信息,则会从根资产逐层遍历内部所有控件的所有文本属性,检查其是否引用自StringTable,找到所有使用引擎随机Key的文本,收集到引擎本地化管理缓存中(一般位于 Content\Localization\{TargetName}\{TargetName}.manifest)
因此,并不能在进行本地化收集的时候,顺带采集到我们所需要的信息。但这也给我们提供了一种思路,可以直接遍历资产找到其所引用的StringTable。因此产生了两个思路
- 写一个工具,遍历所有可能引用StringTable的目录。将这些引用关系保存起来,方便查阅,然后定期更新维护。
- 利用引擎的引用管理器,当需要查询StringTable中某个key的所有使用场景时,首先确定所有引用该StringTable的资产,然后遍历这些资产,找到其中引用了该Key的资产。
**最终采用方案二,通过引擎的引用查看器获取TEXT文本的引用目录,然后遍历引用资源,找出所有引用改TEXT文本的位置并打印