From 1f680d28223b45df572056e2307e8a4cf6c6162b Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:19:34 +0800 Subject: [PATCH] =?UTF-8?q?refactor(localization):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=8C=96=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 FormatVariablePattern 从 readonly 字段改为 const 常量 - 提取复杂的正则替换逻辑到独立的 FormatMatch 方法中 - 新增 GetOptionalGroupValue 辅助方法处理可选组值提取 - 分离格式化值和尝试格式化的逻辑到独立方法 - 简化条件判断并提高代码可读性 - 优化错误处理流程,保持原有功能不变 --- .../Localization/LocalizationString.cs | 83 ++++++++++++------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/GFramework.Core/Localization/LocalizationString.cs b/GFramework.Core/Localization/LocalizationString.cs index 0beb7b0..48eba3a 100644 --- a/GFramework.Core/Localization/LocalizationString.cs +++ b/GFramework.Core/Localization/LocalizationString.cs @@ -11,7 +11,7 @@ public class LocalizationString : ILocalizationString /// /// 匹配 {variableName} 或 {variableName:formatter:args} 的正则表达式模式 /// - private static readonly string FormatVariablePattern = + private const string FormatVariablePattern = @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}"; /// @@ -109,42 +109,61 @@ public class LocalizationString : ILocalizationString } // 使用预编译的静态正则表达式匹配 {variableName} 或 {variableName:formatter:args} - return FormatVariableRegex.Replace(template, match => + return FormatVariableRegex.Replace(template, match => FormatMatch(match, variables, manager)); + } + + private static string FormatMatch( + Match match, + Dictionary variables, + ILocalizationManager manager) + { + var variableName = match.Groups[1].Value; + if (!variables.TryGetValue(variableName, out var value)) { - 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; + return match.Value; + } - if (!variables.TryGetValue(variableName, out var value)) - { - return match.Value; // 保持原样 - } + var formatterName = GetOptionalGroupValue(match, 2); + if (string.IsNullOrEmpty(formatterName)) + { + return FormatValue(value, manager); + } - // 如果没有格式化器,直接转换为字符串 - if (string.IsNullOrEmpty(formatterName)) - { - return value switch - { - IFormattable formattable => formattable.ToString(null, manager.CurrentCulture), - _ => value?.ToString() ?? string.Empty - }; - } + return TryFormatValue(match, value, formatterName, manager, out var result) + ? result + : FormatValue(value, manager); + } - // 尝试使用注册的格式化器 - var formatter = GetFormatter(manager, formatterName); - if (formatter != null && formatter.TryFormat(formatterArgs ?? string.Empty, value, manager.CurrentCulture, - out var result)) - { - return result; - } + private static bool TryFormatValue( + Match match, + object value, + string formatterName, + ILocalizationManager manager, + out string result) + { + var formatterArgs = GetOptionalGroupValue(match, 3) ?? string.Empty; + if (GetFormatter(manager, formatterName) is { } formatter && + formatter.TryFormat(formatterArgs, value, manager.CurrentCulture, out result)) + { + return true; + } - // 格式化失败,返回基本格式化 - return value switch - { - IFormattable formattable => formattable.ToString(null, manager.CurrentCulture), - _ => value?.ToString() ?? string.Empty - }; - }); + result = string.Empty; + return false; + } + + private static string FormatValue(object value, ILocalizationManager manager) + { + return value switch + { + IFormattable formattable => formattable.ToString(null, manager.CurrentCulture), + _ => value.ToString() ?? string.Empty + }; + } + + private static string? GetOptionalGroupValue(Match match, int groupIndex) + { + return match.Groups[groupIndex].Success ? match.Groups[groupIndex].Value : null; } ///