Files
aibis-dream/Assets/Scripts/Dialog System/LocalisedLineProvider.cs
T

84 lines
2.7 KiB
C#

using System.Linq;
using UnityEngine.Localization.Settings;
using Yarn.Unity;
using AibisDream.Framework;
using AibisDream.Utility;
namespace AibisDream
{
public class LocalisedLineProvider : LineProviderBehaviour
{
private LocalizationTable _localizationTable;
public override string LocaleCode => LocalizationSettings.SelectedLocale.Identifier.Code;
// 本地化表存在即可用
public override bool LinesAvailable => _localizationTable != null;
public override LocalizedLine GetLocalizedLine(Yarn.Line line)
{
var text = line.ID;
if (_localizationTable != null)
{
text = _localizationTable[line.ID]?.LocalizedValue ??
$"Err: Missing localisation for line {line.ID} in string table {_localizationTable.LocaleIdentifier}";
}
LocalizeSubstitutions(line);
var resText = CommonUtil.Escape(text);
// Construct the localized line
LocalizedLine localizedLine = new LocalizedLine
{
TextID = line.ID,
RawText = resText,
Substitutions = line.Substitutions,
Metadata = YarnProject.lineMetadata.GetMetadata(line.ID)
};
// Attempt to fetch metadata tags for this line from the string
// table
if (_localizationTable == null) return localizedLine;
var metadata = _localizationTable[line.ID]?.SharedEntry.Metadata
.GetMetadata<Yarn.Unity.UnityLocalization.LineMetadata>();
if (metadata != null && localizedLine.Metadata != null)
{
localizedLine.Metadata = localizedLine.Metadata.Concat(metadata.tags).ToArray();
}
else if (localizedLine.Metadata == null && metadata != null)
{
localizedLine.Metadata = metadata.tags;
}
return localizedLine;
}
private void LocalizeSubstitutions(Yarn.Line line)
{
for (var i = 0; i < line.Substitutions.Length; i++)
{
line.Substitutions[i] = LocalizationKit.LocalizeParam(line.Substitutions[i]);
}
}
/// <summary>
/// 初始化StringTable
/// </summary>
/// <param name="tableName">本地化表名称</param>
/// <returns>协程</returns>
public void InitStringTable(string tableName)
{
// 释放
_localizationTable?.Dispose();
// 加载
_localizationTable = new LocalizationTable(tableName);
}
public string GetStringTableName()
{
return _localizationTable.TableName;
}
}
}