From 5fb96761a305acda0eb4d7d888c5a32f96117b3c Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Wed, 18 Mar 2026 23:25:09 +0800 Subject: [PATCH] =?UTF-8?q?docs(localization):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=8C=96=E6=96=87=E6=A1=A3=E5=B9=B6=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了配置项暂不支持的说明信息 - 扩展了语言变化监听的使用方式,增加命名方法订阅示例 - 完善了覆盖机制的文档说明 - 优化了异常处理逻辑,精确捕获本地化相关异常 - 实现了正则表达式的预编译以提升性能 - 添加了必要的命名空间引用 --- .../Localization/LocalizationManager.cs | 3 +- .../Localization/LocalizationString.cs | 19 +++++++++---- docs/zh-CN/core/localization.md | 28 ++++++++++++++----- 3 files changed, 37 insertions(+), 13 deletions(-) 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