mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
refactor(localization): 重构本地化字符串格式化逻辑
- 将 FormatVariablePattern 从 readonly 字段改为 const 常量 - 提取复杂的正则替换逻辑到独立的 FormatMatch 方法中 - 新增 GetOptionalGroupValue 辅助方法处理可选组值提取 - 分离格式化值和尝试格式化的逻辑到独立方法 - 简化条件判断并提高代码可读性 - 优化错误处理流程,保持原有功能不变
This commit is contained in:
parent
075d397a4c
commit
1f680d2822
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user