84 lines
2.8 KiB
C#
84 lines
2.8 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], _localizationTable);
|
|
}
|
|
}
|
|
|
|
/// <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;
|
|
}
|
|
}
|
|
} |