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;
}
///