public override void Read(AssetBinaryReader reader, bool includeHeader, long leng1, long leng2 = 0) { if (includeHeader) { PropertyGuid = reader.ReadPropertyGuid(); } if (reader.Asset.EngineVersion < UE4Version.VER_UE4_FTEXT_HISTORY) { CultureInvariantString = reader.ReadFString(); if (reader.Asset.EngineVersion >= UE4Version.VER_UE4_ADDED_NAMESPACE_AND_KEY_DATA_TO_FTEXT) { Namespace = reader.ReadFString(); Value = reader.ReadFString(); } else { Namespace = null; Value = reader.ReadFString(); } } Flags = (ETextFlag)reader.ReadUInt32(); if (reader.Asset.EngineVersion >= UE4Version.VER_UE4_FTEXT_HISTORY) { HistoryType = (TextHistoryType)reader.ReadSByte(); switch (HistoryType) { case TextHistoryType.None: Value = null; if (reader.Asset.GetCustomVersion <FEditorObjectVersion>() >= FEditorObjectVersion.CultureInvariantTextSerializationKeyStability) { bool bHasCultureInvariantString = reader.ReadInt32() == 1; if (bHasCultureInvariantString) { CultureInvariantString = reader.ReadFString(); } } break; case TextHistoryType.Base: Namespace = reader.ReadFString(); Value = reader.ReadFString(); CultureInvariantString = reader.ReadFString(); break; case TextHistoryType.StringTableEntry: TableId = reader.ReadFName(); Value = reader.ReadFString(); break; default: throw new NotImplementedException("Unimplemented reader for " + HistoryType.ToString()); } } }
// https://github.com/EpicGames/UnrealEngine/blob/7d9919ac7bfd80b7483012eab342cb427d60e8c9/Engine/Source/Runtime/Core/Private/Internationalization/Text.cpp#L769 internal FText(PackageReader reader) { Flags = (ETextFlag)reader.ReadUInt32(); // "Assuming" the reader/archive is persistent Flags &= ETextFlag.ConvertedProperty | ETextFlag.InitializedFromString; // Execute if UE4 version is at least VER_UE4_FTEXT_HISTORY // The type is serialized during the serialization of the history, during deserialization we need to deserialize it and create the correct history var HistoryType = (ETextHistoryType)reader.ReadSByte(); // Create the history class based on the serialized type switch (HistoryType) { case ETextHistoryType.Base: Text = new FTextHistory.Base(reader); break; case ETextHistoryType.AsDateTime: Text = new FTextHistory.DateTime(reader); break; // https://github.com/EpicGames/UnrealEngine/blob/bf95c2cbc703123e08ab54e3ceccdd47e48d224a/Engine/Source/Runtime/Core/Private/Internationalization/TextHistory.cpp // https://github.com/EpicGames/UnrealEngine/blob/bf95c2cbc703123e08ab54e3ceccdd47e48d224a/Engine/Source/Runtime/Core/Private/Internationalization/TextData.h case ETextHistoryType.NamedFormat: case ETextHistoryType.OrderedFormat: Text = new FTextHistory.OrderedFormat(reader); break; case ETextHistoryType.AsNumber: case ETextHistoryType.AsPercent: case ETextHistoryType.AsCurrency: Text = new FTextHistory.FormatNumber(reader); break; case ETextHistoryType.StringTableEntry: Text = new FTextHistory.StringTableEntry(reader); break; case ETextHistoryType.ArgumentFormat: case ETextHistoryType.AsDate: case ETextHistoryType.AsTime: case ETextHistoryType.Transform: case ETextHistoryType.TextGenerator: throw new NotImplementedException(string.Format(FModel.Properties.Resources.ParsingNotSupported, HistoryType)); default: Text = new FTextHistory.None(reader); break; } }
internal FText(ETextFlag flags, FTextHistory text) { Flags = flags; Text = text; }