refactor(localization): 重构本地化字符串格式化逻辑

- 将 FormatVariablePattern 从 readonly 字段改为 const 常量
- 提取复杂的正则替换逻辑到独立的 FormatMatch 方法中
- 新增 GetOptionalGroupValue 辅助方法处理可选组值提取
- 分离格式化值和尝试格式化的逻辑到独立方法
- 简化条件判断并提高代码可读性
- 优化错误处理流程,保持原有功能不变
This commit is contained in:
GeWuYou 2026-03-19 09:19:34 +08:00
parent 075d397a4c
commit 1f680d2822

View File

@ -11,7 +11,7 @@ public class LocalizationString : ILocalizationString
/// <summary> /// <summary>
/// 匹配 {variableName} 或 {variableName:formatter:args} 的正则表达式模式 /// 匹配 {variableName} 或 {variableName:formatter:args} 的正则表达式模式
/// </summary> /// </summary>
private static readonly string FormatVariablePattern = private const string FormatVariablePattern =
@"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}"; @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}";
/// <summary> /// <summary>
@ -109,42 +109,61 @@ public class LocalizationString : ILocalizationString
} }
// 使用预编译的静态正则表达式匹配 {variableName} 或 {variableName:formatter:args} // 使用预编译的静态正则表达式匹配 {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<string, object> variables,
ILocalizationManager manager)
{
var variableName = match.Groups[1].Value;
if (!variables.TryGetValue(variableName, out var value))
{ {
var variableName = match.Groups[1].Value; return match.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)) var formatterName = GetOptionalGroupValue(match, 2);
{ if (string.IsNullOrEmpty(formatterName))
return match.Value; // 保持原样 {
} return FormatValue(value, manager);
}
// 如果没有格式化器,直接转换为字符串 return TryFormatValue(match, value, formatterName, manager, out var result)
if (string.IsNullOrEmpty(formatterName)) ? result
{ : FormatValue(value, manager);
return value switch }
{
IFormattable formattable => formattable.ToString(null, manager.CurrentCulture),
_ => value?.ToString() ?? string.Empty
};
}
// 尝试使用注册的格式化器 private static bool TryFormatValue(
var formatter = GetFormatter(manager, formatterName); Match match,
if (formatter != null && formatter.TryFormat(formatterArgs ?? string.Empty, value, manager.CurrentCulture, object value,
out var result)) string formatterName,
{ ILocalizationManager manager,
return result; 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;
}
// 格式化失败,返回基本格式化 result = string.Empty;
return value switch return false;
{ }
IFormattable formattable => formattable.ToString(null, manager.CurrentCulture),
_ => value?.ToString() ?? string.Empty 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;
} }
/// <summary> /// <summary>