using System.Text.RegularExpressions; using GFramework.Core.Abstractions.Localization; namespace GFramework.Core.Localization; /// /// 本地化字符串实现 /// public class LocalizationString : ILocalizationString { private readonly ILocalizationManager _manager; private readonly Dictionary _variables; /// /// 初始化本地化字符串 /// /// 本地化管理器 /// 表名 /// 键名 public LocalizationString(ILocalizationManager manager, string table, string key) { _manager = manager ?? throw new ArgumentNullException(nameof(manager)); Table = table ?? throw new ArgumentNullException(nameof(table)); Key = key ?? throw new ArgumentNullException(nameof(key)); _variables = new Dictionary(); } /// public string Table { get; } /// public string Key { get; } /// public ILocalizationString WithVariable(string name, object value) { if (name == null) { throw new ArgumentNullException(nameof(name)); } _variables[name] = value; return this; } /// public ILocalizationString WithVariables(params (string name, object value)[] variables) { if (variables == null) { throw new ArgumentNullException(nameof(variables)); } foreach (var (name, value) in variables) { WithVariable(name, value); } return this; } /// public string Format() { var rawText = GetRaw(); return FormatString(rawText, _variables, _manager); } /// public string GetRaw() { if (!_manager.TryGetText(Table, Key, out var text)) { return $"[{Table}.{Key}]"; } return text; } /// public bool Exists() { return _manager.TryGetText(Table, Key, out _); } /// /// 格式化字符串(支持变量替换和格式化器) /// private static string FormatString( string template, Dictionary variables, ILocalizationManager manager) { if (string.IsNullOrEmpty(template)) { return template; } // 匹配 {variableName} 或 {variableName:formatter:args} var pattern = @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}"; var regex = new Regex(pattern); return regex.Replace(template, match => { var variableName = match.Groups[1].Value; var formatterName = match.Groups[2].Success ? match.Groups[2].Value : null; var formatterArgs = match.Groups[3].Success ? match.Groups[3].Value : null; if (!variables.TryGetValue(variableName, out var value)) { return match.Value; // 保持原样 } // 如果没有格式化器,直接转换为字符串 if (string.IsNullOrEmpty(formatterName)) { return value switch { IFormattable formattable => formattable.ToString(null, manager.CurrentCulture), _ => value?.ToString() ?? string.Empty }; } // 尝试使用注册的格式化器 var formatter = GetFormatter(manager, formatterName); if (formatter != null && formatter.TryFormat(formatterArgs ?? string.Empty, value, manager.CurrentCulture, out var result)) { return result; } // 格式化失败,返回基本格式化 return value switch { IFormattable formattable => formattable.ToString(null, manager.CurrentCulture), _ => value?.ToString() ?? string.Empty }; }); } /// /// 获取格式化器 /// private static ILocalizationFormatter? GetFormatter(ILocalizationManager manager, string name) { return manager.GetFormatter(name); } }