docs(localization): 更新本地化文档并完善功能实现

- 添加了配置项暂不支持的说明信息
- 扩展了语言变化监听的使用方式,增加命名方法订阅示例
- 完善了覆盖机制的文档说明
- 优化了异常处理逻辑,精确捕获本地化相关异常
- 实现了正则表达式的预编译以提升性能
- 添加了必要的命名空间引用
This commit is contained in:
GeWuYou 2026-03-18 23:25:09 +08:00
parent e49713a842
commit 5fb96761a3
3 changed files with 37 additions and 13 deletions

View File

@ -105,8 +105,9 @@ public class LocalizationManager : AbstractSystem, ILocalizationManager
text = GetText(table, key); text = GetText(table, key);
return true; return true;
} }
catch catch (LocalizationException)
{ {
// 只捕获本地化相关的异常(键不存在、表不存在等)
text = string.Empty; text = string.Empty;
return false; return false;
} }

View File

@ -8,6 +8,18 @@ namespace GFramework.Core.Localization;
/// </summary> /// </summary>
public class LocalizationString : ILocalizationString public class LocalizationString : ILocalizationString
{ {
/// <summary>
/// 匹配 {variableName} 或 {variableName:formatter:args} 的正则表达式模式
/// </summary>
private static readonly string FormatVariablePattern =
@"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}";
/// <summary>
/// 预编译的静态正则表达式,用于格式化字符串中的变量替换
/// </summary>
private static readonly Regex FormatVariableRegex =
new(FormatVariablePattern, RegexOptions.Compiled | RegexOptions.CultureInvariant);
private readonly ILocalizationManager _manager; private readonly ILocalizationManager _manager;
private readonly Dictionary<string, object> _variables; private readonly Dictionary<string, object> _variables;
@ -96,11 +108,8 @@ public class LocalizationString : ILocalizationString
return template; return template;
} }
// 匹配 {variableName} 或 {variableName:formatter:args} // 使用预编译的静态正则表达式匹配 {variableName} 或 {variableName:formatter:args}
var pattern = @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}"; return FormatVariableRegex.Replace(template, match =>
var regex = new Regex(pattern);
return regex.Replace(template, match =>
{ {
var variableName = match.Groups[1].Value; var variableName = match.Groups[1].Value;
var formatterName = match.Groups[2].Success ? match.Groups[2].Value : null; var formatterName = match.Groups[2].Success ? match.Groups[2].Value : null;

View File

@ -103,11 +103,13 @@ bool TryFormat(string format, object value, IFormatProvider? provider, out strin
string DefaultLanguage { get; set; } // 默认语言代码,默认 "eng" string DefaultLanguage { get; set; } // 默认语言代码,默认 "eng"
string FallbackLanguage { get; set; } // 回退语言代码,默认 "eng" string FallbackLanguage { get; set; } // 回退语言代码,默认 "eng"
string LocalizationPath { get; set; } // 本地化文件路径,默认 "res://localization" string LocalizationPath { get; set; } // 本地化文件路径,默认 "res://localization"
string OverridePath { get; set; } // 用户覆盖路径,默认 "user://localization_override" string OverridePath { get; set; } // 用户覆盖路径,默认 "user://localization_override" (暂不支持)
bool EnableHotReload { get; set; } // 是否启用热重载,默认 true bool EnableHotReload { get; set; } // 是否启用热重载,默认 true (暂不支持)
bool ValidateOnLoad { get; set; } // 是否在加载时验证,默认 true bool ValidateOnLoad { get; set; } // 是否在加载时验证,默认 true (暂不支持)
``` ```
**注意:** `OverridePath``EnableHotReload``ValidateOnLoad` 配置项已定义但当前版本暂不支持,将在后续版本中实现。
## 文件组织 ## 文件组织
### 目录结构 ### 目录结构
@ -247,15 +249,25 @@ foreach (var lang in languages)
### 监听语言变化 ### 监听语言变化
```csharp ```csharp
// 订阅语言变化事件 // 方式 1: 使用 lambda 表达式(无法取消订阅)
locManager.SubscribeToLanguageChange(language => locManager.SubscribeToLanguageChange(language =>
{ {
Debug.Log($"Language changed to: {language}"); Debug.Log($"Language changed to: {language}");
// 更新 UI、重新加载资源等 // 更新 UI、重新加载资源等
}); });
// 取消订阅 // 方式 2: 使用命名方法(推荐,可以取消订阅)
locManager.UnsubscribeFromLanguageChange(callback); void OnLanguageChanged(string language)
{
Debug.Log($"Language changed to: {language}");
// 更新 UI、重新加载资源等
}
// 订阅
locManager.SubscribeToLanguageChange(OnLanguageChanged);
// 取消订阅(使用相同的方法引用)
locManager.UnsubscribeFromLanguageChange(OnLanguageChanged);
``` ```
## 高级功能 ## 高级功能
@ -278,7 +290,9 @@ var text = locManager.GetText("common", "new.feature");
### 覆盖机制 ### 覆盖机制
用户可以在 `user://localization_override/` 目录下放置覆盖文件: **注意:** 覆盖机制功能已规划但当前版本暂不支持,将在后续版本中实现。
未来版本中,用户可以在 `user://localization_override/` 目录下放置覆盖文件:
```json ```json
// user://localization_override/eng/common.json // user://localization_override/eng/common.json