diff --git a/GFramework.Core/Localization/LocalizationManager.cs b/GFramework.Core/Localization/LocalizationManager.cs
index 202bbcd..5ff4d88 100644
--- a/GFramework.Core/Localization/LocalizationManager.cs
+++ b/GFramework.Core/Localization/LocalizationManager.cs
@@ -105,8 +105,9 @@ public class LocalizationManager : AbstractSystem, ILocalizationManager
text = GetText(table, key);
return true;
}
- catch
+ catch (LocalizationException)
{
+ // 只捕获本地化相关的异常(键不存在、表不存在等)
text = string.Empty;
return false;
}
diff --git a/GFramework.Core/Localization/LocalizationString.cs b/GFramework.Core/Localization/LocalizationString.cs
index e15a5c1..0beb7b0 100644
--- a/GFramework.Core/Localization/LocalizationString.cs
+++ b/GFramework.Core/Localization/LocalizationString.cs
@@ -8,6 +8,18 @@ namespace GFramework.Core.Localization;
///
public class LocalizationString : ILocalizationString
{
+ ///
+ /// 匹配 {variableName} 或 {variableName:formatter:args} 的正则表达式模式
+ ///
+ private static readonly string FormatVariablePattern =
+ @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}";
+
+ ///
+ /// 预编译的静态正则表达式,用于格式化字符串中的变量替换
+ ///
+ private static readonly Regex FormatVariableRegex =
+ new(FormatVariablePattern, RegexOptions.Compiled | RegexOptions.CultureInvariant);
+
private readonly ILocalizationManager _manager;
private readonly Dictionary _variables;
@@ -96,11 +108,8 @@ public class LocalizationString : ILocalizationString
return template;
}
- // 匹配 {variableName} 或 {variableName:formatter:args}
- var pattern = @"\{([a-zA-Z_][a-zA-Z0-9_]*)(?::([a-zA-Z_][a-zA-Z0-9_]*)(?::([^}]+))?)?\}";
- var regex = new Regex(pattern);
-
- return regex.Replace(template, match =>
+ // 使用预编译的静态正则表达式匹配 {variableName} 或 {variableName:formatter:args}
+ return FormatVariableRegex.Replace(template, match =>
{
var variableName = match.Groups[1].Value;
var formatterName = match.Groups[2].Success ? match.Groups[2].Value : null;
diff --git a/docs/zh-CN/core/localization.md b/docs/zh-CN/core/localization.md
index 440e051..03cb112 100644
--- a/docs/zh-CN/core/localization.md
+++ b/docs/zh-CN/core/localization.md
@@ -103,11 +103,13 @@ bool TryFormat(string format, object value, IFormatProvider? provider, out strin
string DefaultLanguage { get; set; } // 默认语言代码,默认 "eng"
string FallbackLanguage { get; set; } // 回退语言代码,默认 "eng"
string LocalizationPath { get; set; } // 本地化文件路径,默认 "res://localization"
-string OverridePath { get; set; } // 用户覆盖路径,默认 "user://localization_override"
-bool EnableHotReload { get; set; } // 是否启用热重载,默认 true
-bool ValidateOnLoad { get; set; } // 是否在加载时验证,默认 true
+string OverridePath { get; set; } // 用户覆盖路径,默认 "user://localization_override" (暂不支持)
+bool EnableHotReload { get; set; } // 是否启用热重载,默认 true (暂不支持)
+bool ValidateOnLoad { get; set; } // 是否在加载时验证,默认 true (暂不支持)
```
+**注意:** `OverridePath`、`EnableHotReload` 和 `ValidateOnLoad` 配置项已定义但当前版本暂不支持,将在后续版本中实现。
+
## 文件组织
### 目录结构
@@ -247,15 +249,25 @@ foreach (var lang in languages)
### 监听语言变化
```csharp
-// 订阅语言变化事件
+// 方式 1: 使用 lambda 表达式(无法取消订阅)
locManager.SubscribeToLanguageChange(language =>
{
Debug.Log($"Language changed to: {language}");
// 更新 UI、重新加载资源等
});
-// 取消订阅
-locManager.UnsubscribeFromLanguageChange(callback);
+// 方式 2: 使用命名方法(推荐,可以取消订阅)
+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
// user://localization_override/eng/common.json