using System.Linq; using UnityEngine.Localization.Settings; using Yarn.Unity; using AibisDream.Framework; using UnityEngine; namespace AibisDream { public class LocalisedLineProvider : LineProviderBehaviour { private const string LocalizationPrefix = "l10n."; private LocalizationTable _localizationTable; public override string LocaleCode => LocalizationSettings.SelectedLocale.Identifier.Code; // 本地化表存在即可用 public override bool LinesAvailable => _localizationTable != null; // We're good to go! 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++) { if (line.Substitutions[i].StartsWith(LocalizationPrefix)) { var localizationKey = line.Substitutions[i].Substring(LocalizationPrefix.Length); // 获取本地化值 if (_localizationTable.TryGetValue(localizationKey, out var value)) { line.Substitutions[i] = value.LocalizedValue; } else { // 如果找不到,则使用原始值 Debug.LogWarning($"Variable Key '{localizationKey}' not found in localization table."); line.Substitutions[i] = localizationKey; } } } } /// /// 初始化StringTable /// /// 本地化表名称 /// 协程 public void InitStringTable(string tableName) { Debug.Log(tableName + "Init"); // 释放 _localizationTable?.Dispose(); // 加载 _localizationTable = new LocalizationTable(tableName); } public string GetStringTableName() { return _localizationTable.TableName; } } }