本地化与语义锚点
Texturge 提供内置的本地化支持,解决文本动画在跨语言场景中的一个核心难题——如何在翻译后的文本中定位动画效果的位置。
问题场景
当一段文本 “Hello World” 翻译为中文 “你好世界” 后:
- 字符数从 11 变为 4
- 每个字符的位置完全改变
- 原先针对 “World” 的逐字动画效果无法简单按字符索引平移
Texturge 通过语义锚点(Semantic Anchor)和本地化子系统(Localization Subsystem)解决此问题。
ULocalizationSubsystem
ULocalizationSubsystem 是一个 UGameInstanceSubsystem,在游戏启动时自动初始化。
核心功能
| 功能 | 说明 |
|---|---|
| 语言切换 | 通过 SetLanguage(CultureCode) 切换当前语言,触发 StringTable 重载和锚点重定位 |
| 锚点重定位 | RelocateAnchors() 在目标语言文本中定位每个语义锚点的新位置 |
| 缓存管理 | AnchorCache 缓存锚点查询结果,ClearCache() 强制重新计算 |
| 事件广播 | OnLanguageChanged 多播委托,通知所有监听者语言已变更 |
生命周期
GameInstance 启动
│
▼
Initialize()
├── 扫描 StringTable 资产
└── 绑定 FInternationalization::OnCultureChanged
│
▼ (语言切换时)
OnCultureChanged()
├── ClearCache()
└── Broadcast OnLanguageChanged
API
// 设置语言
Subsystem->SetLanguage("zh-CN");
// 重定位锚点
TMap<FName, int32> NewPositions = Subsystem->RelocateAnchors(
Anchors, // 语义锚点数组
SourceText, // 源语言文本
TargetText // 目标语言文本
);
// 清空缓存
Subsystem->ClearCache();
语义锚点
struct FSemanticAnchor
{
FName AnchorId; // 锚点唯一标识符
FString ContextualSnippet; // 上下文片段(用于定位)
int32 SourceOffset; // 源文本中的偏移量
};
工作原理
-
定义阶段:在源语言文本中,为关键位置定义锚点。每个锚点包含一个
ContextualSnippet(上下文片段,通常是锚点前后的几个词)和SourceOffset(该位置在源文本中的字符索引)。 -
重定位阶段:当语言切换后,
RelocateAnchors()对每个锚点:- 尝试在目标文本中精确匹配
ContextualSnippet - 若精确匹配失败,使用最长公共子串(LCS)算法进行近似匹配
- 计算匹配置信度(
CalculateConfidence()) - 返回目标文本中的新偏移量
- 尝试在目标文本中精确匹配
-
应用阶段:动画系统使用新的偏移量调整动画效果的作用范围。
匹配策略
| 策略 | 说明 |
|---|---|
| 精确匹配 | 在目标文本中直接查找 ContextualSnippet 子串 |
| LCS 近似匹配 | 当精确匹配失败时,计算源片段与目标文本各位置的最长公共子串,选择最长匹配 |
匹配置信度
Confidence = MatchLength / SnippetLength
置信度范围 0.0 ~ 1.0,调用方可设定阈值来决定是否接受近似匹配结果。
控件集成
UAnimatedTextBlock 和 UAnimatedRichTextBlock 均监听 OnLanguageChanged 事件。语言切换时自动:
- 获取新语言版本的文本(通过 StringTable 重载机制)
- 重新执行动画管线(
SetPlainText/SetRichText→ExecutePipeline) - 若配置了锚点,使用
RelocateAnchors()定位动画效果的新位置
StringTable 集成
ScanStringTableAssets() 扫描项目中所有 UStringTable 资产,过滤注册到指定命名空间前缀的表。这些表用于在语言切换时自动提供翻译文本。
本地化数据
Texturge 本身的内置文本已支持本地化,本地化文件位于 Plugins/Texturge/Content/Localization/Texturge/:
| 语言 | 文化代码 | 文件 |
|---|---|---|
| 简体中文(原生) | zh-Hans | zh-Hans/Texturge.locres |
| 英语 | en | en/Texturge.locres |