多语言本地化设置
Texturge 通过 ULocalizationSubsystem(UGameInstanceSubsystem)提供运行时语言切换能力,借助 FSemanticAnchor 的 LCS 匹配机制确保翻译后动画逐字符对应不失效。
NOTE
Texturge 不使用 UE5 原生
UStringTable进行文本本地化。自有ULocalizationSubsystem与语义锚定机制独立于引擎本地化框架,仅复用引擎的文化切换事件(FInternationalization::OnCultureChanged)。
支持的语言
Texturge.uplugin 的本地化目标支持 15 种语言(NativeCulture = en):
| 语言 | 代码 | 语言 | 代码 | |
|---|---|---|---|---|
| 英语 | en | 波兰语 | pl | |
| 简体中文 | zh-Hans | 德语 | de | |
| 日语 | ja | 俄语 | ru | |
| 韩语 | ko | 法语 | fr | |
| 西班牙语 | es | 巴西葡萄牙语 | pt-BR | |
| 葡萄牙语 | pt | 土耳其语 | tr | |
| 阿拉伯语 | ar | 拉丁美洲西班牙语 | es-419 | |
| 意大利语 | it |
运行时语言切换
// 获取子系统
ULocalizationSubsystem* Localization = GetGameInstance()->GetSubsystem<ULocalizationSubsystem>();
// 切换语言(Culture Code)
Localization->SetLanguage(TEXT("ja")); // 日语
Localization->SetLanguage(TEXT("zh-Hans")); // 简体中文
Localization->SetLanguage(TEXT("ar")); // 阿拉伯语
SetLanguage 设置当前文化并广播 OnLanguageChanged(FString NewCulture)(多播委托)。UAnimatedTextBlock / UAnimatedRichTextBlock 监听该事件,语言切换后自动触发重编译与重播放。
语义锚定机制
FSemanticAnchor(AnchorId / ContextualSnippet / SourceOffset)使用 LCS(最长公共子串)算法进行跨翻译文本定位。
问题场景
翻译前后的文本长度与字符序列不同:
- 英文
"Hello"(5 字符)→ 简体中文"你好"(2 字符) - 每个字符在动画中拥有独立的调度与曲线数据
锚定原理
static TMap<FName, int32> ULocalizationSubsystem::RelocateAnchors(
const TArray<FSemanticAnchor>& InAnchors,
const FString& InSourceText,
const FString& InTargetText);
- 精确匹配(忽略大小写)优先
- 未精确匹配的锚点通过
FindLongestCommonSubstring做近似匹配 CalculateConfidence计算匹配置信度(0.0~1.0),低置信度去重- 偏移量 Clamp 在目标文本范围内
效果保证
- 原有字符的动画曲线在新语言中继续保持
- 删除 / 新增的字符不会导致动画数据错位或崩溃
- 各语言下动画起始 / 结束时间点保持一致
本地化资产配置
插件的 .uplugin 中包含 7 个本地化目标,全部覆盖 15 种语言:
| 目标 | 加载策略 | 内容 |
|---|---|---|
TexturgeRuntime | Always | 运行时文本(节点显示名、提示) |
TexturgeEditor | Editor | 编辑器 UI 文本 |
TexturgeEditorTutorials | Never | 编辑器教程 |
TexturgePropertyNames | PropertyNames | 属性名翻译 |
TexturgeToolTips | ToolTips | 工具提示翻译 |
TexturgeKeywords | Editor | 关键字 |
TexturgeCategory | Editor | 分类名 |
预配置的本地化目标无需手动创建,插件加载时自动注册。
Unicode 支持
Texturge 内部使用 Texturge::Unicode 命名空间工具进行码点级分类(IsCJK / IsCJKPunctuation / IsHiragana / IsKatakana / IsHangulSyllables 等),配合 FCharBreakIterator 预计算断点(CJK 附着、Surrogate Pair Emoji、韩文音节),确保 CJK 与 RTL 文本正确逐字动画。