using System.Linq; using UnityEngine.Localization.Settings; using Yarn.Unity; using AibisDream.Framework; 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 ?? $"Error: Missing localisation for line {line.ID} in string table {_localizationTable.LocaleIdentifier}"; } LocalizeSubstitutions(line); // Construct the localized line LocalizedLine localizedLine = new LocalizedLine { TextID = line.ID, RawText = text, 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(); 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); } } /// /// 初始化StringTable /// /// 本地化表名称 /// 协程 public void InitStringTable(string tableName) { // 释放 _localizationTable?.Dispose(); // 加载 _localizationTable = new LocalizationTable(tableName); } public string GetStringTableName() { return _localizationTable.TableName; } } }