请问下目前有没有更好的解决方案,谢谢!之前使用复合字体配置如下,没法兼容,目前只能使用切换字体方式。
重现步骤
你好,现在我们遇到个本地化字体问题。
问题:简体中文汉字和日文汉字CJK Unicode重叠,复合字体配置无法完全兼容切换不同语言后字体正确显示。
目前在使用方案是切换字体来实现:
- 通过监听FInternationalization::Get().OnCultureChanged()
- 然后异步加载对应语言的复合字体到缓存。
- 在UTextBlock中绑定Change事件并且切换字体
自定义的UTextBlock中处理如下,因为项目后期不能使用自定义UTextBlock了,所以这部分代码写到引擎中UTextBlock有风险吗? 请问下目前有没有更好的解决方案,谢谢!
`void UXXTextBlock::OnWidgetRebuilt()
{
Super::OnWidgetRebuilt();
if(GetGameInstance() && GetGameInstance()->GetWorld())
{
// 获取子系统并绑定事件
if (ULocalizationSubsystem* LocalizationSubsystem = GetGameInstance()->GetSubsystem())
{
if(!LocalizationSubsystem->OnCultureUpdate.Contains(this, GET_FUNCTION_NAME_CHECKED(ULSATextBlock, UpdateFont)))
{
LocalizationSubsystem->OnCultureUpdate.AddDynamic(this, &ULSATextBlock::UpdateFont);
}
}
}
}
void UXXTextBlock::UpdateFont(UFont* NewFont)
{
FSlateFontInfo FontInfo = Font;
FontInfo.FontObject = NewFont;
FontInfo.Size = Font.Size;
SetFont(FontInfo);
UE_LOG(LogTemp, Log, TEXT(" >>> UpdateFont: %s"), *GetText().ToString());
}`
CJK Unicode重叠的问题没法通过编码解决,实际运用中也是通过切换Font来实现不同字体的显示的。所以我觉得你直接改应该没啥问题。还有一种做法是富文本,在检测到Culture切换的时候插入<font>来改变显示的内容。