本地化与语义锚点

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;         // 源文本中的偏移量
};

工作原理

  1. 定义阶段:在源语言文本中,为关键位置定义锚点。每个锚点包含一个 ContextualSnippet(上下文片段,通常是锚点前后的几个词)和 SourceOffset(该位置在源文本中的字符索引)。

  2. 重定位阶段:当语言切换后,RelocateAnchors() 对每个锚点:

    • 尝试在目标文本中精确匹配 ContextualSnippet
    • 若精确匹配失败,使用最长公共子串(LCS)算法进行近似匹配
    • 计算匹配置信度(CalculateConfidence()
    • 返回目标文本中的新偏移量
  3. 应用阶段:动画系统使用新的偏移量调整动画效果的作用范围。

匹配策略

策略说明
精确匹配在目标文本中直接查找 ContextualSnippet 子串
LCS 近似匹配当精确匹配失败时,计算源片段与目标文本各位置的最长公共子串,选择最长匹配

匹配置信度

Confidence = MatchLength / SnippetLength

置信度范围 0.0 ~ 1.0,调用方可设定阈值来决定是否接受近似匹配结果。

控件集成

UAnimatedTextBlockUAnimatedRichTextBlock 均监听 OnLanguageChanged 事件。语言切换时自动:

  1. 获取新语言版本的文本(通过 StringTable 重载机制)
  2. 重新执行动画管线(SetPlainText / SetRichTextExecutePipeline
  3. 若配置了锚点,使用 RelocateAnchors() 定位动画效果的新位置

StringTable 集成

ScanStringTableAssets() 扫描项目中所有 UStringTable 资产,过滤注册到指定命名空间前缀的表。这些表用于在语言切换时自动提供翻译文本。

本地化数据

Texturge 本身的内置文本已支持本地化,本地化文件位于 Plugins/Texturge/Content/Localization/Texturge/

语言文化代码文件
简体中文(原生)zh-Hanszh-Hans/Texturge.locres
英语enen/Texturge.locres
images/semantic-anchor-relocation.png — 语义锚点重定位示意:英文源文本 → 中文目标文本,锚点 A/B 通过 LCS 匹配重新定位,虚线连接新旧位置
images/localization-settings.png — Texturge 配置面板中本地化选项:StringTable 命名空间前缀、默认文化代码下拉菜单、锚点匹配置信度阈值滑块