From a0ce04b185d11041ade6ca74ff0f03ac1d4e9228 Mon Sep 17 00:00:00 2001 From: gewuyou <95328647+GeWuYou@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:46:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(godot):=20=E6=94=B6=E7=B4=A7=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=8C=96=E6=98=A0=E5=B0=84=E9=9B=86=E5=90=88=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 LocalizationMap 对可变 Dictionary 的直接公共暴露,降低 MA0016 集合暴露风险 - 新增复制输入映射的构造函数,并保留默认映射初始化行为以维持现有消费者兼容性 - 更新 XML 注释,明确只读访问语义和内部状态隔离原因 --- .../Setting/Data/LocalizationMap.cs | 61 ++++++++++++++++--- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/GFramework.Godot/Setting/Data/LocalizationMap.cs b/GFramework.Godot/Setting/Data/LocalizationMap.cs index fffcd0f7..369d0fc3 100644 --- a/GFramework.Godot/Setting/Data/LocalizationMap.cs +++ b/GFramework.Godot/Setting/Data/LocalizationMap.cs @@ -20,24 +20,47 @@ public class LocalizationMap { private const string DefaultFrameworkLanguage = "eng"; private const string DefaultGodotLocale = "en"; + private readonly Dictionary _frameworkLanguageMap; + private readonly Dictionary _languageMap; /// - /// 用户语言 -> Godot locale 映射表。 + /// 使用默认的 Godot locale 与框架语言码映射初始化本地化设置。 /// - public Dictionary LanguageMap { get; set; } = new(StringComparer.Ordinal) + public LocalizationMap() + : this(CreateDefaultLanguageMap(), CreateDefaultFrameworkLanguageMap()) { - { "简体中文", "zh_CN" }, - { "English", "en" } - }; + } /// - /// 用户语言 -> GFramework 本地化语言码映射表。 + /// 使用外部提供的映射初始化本地化设置。 + /// 构造函数会复制输入字典,避免调用方在实例创建后继续修改内部状态。 /// - public Dictionary FrameworkLanguageMap { get; set; } = new(StringComparer.Ordinal) + /// 用户语言到 Godot locale 的映射。 + /// 用户语言到 GFramework 本地化语言码的映射。 + /// + /// 当 时抛出。 + /// + public LocalizationMap( + IReadOnlyDictionary languageMap, + IReadOnlyDictionary frameworkLanguageMap) { - { "简体中文", "zhs" }, - { "English", "eng" } - }; + ArgumentNullException.ThrowIfNull(languageMap); + ArgumentNullException.ThrowIfNull(frameworkLanguageMap); + + // 复制外部输入,避免公共属性把可变集合直接暴露给调用方。 + _languageMap = new Dictionary(languageMap, StringComparer.Ordinal); + _frameworkLanguageMap = new Dictionary(frameworkLanguageMap, StringComparer.Ordinal); + } + + /// + /// 获取用户语言到 Godot locale 的只读映射表。 + /// + public IReadOnlyDictionary LanguageMap => _languageMap; + + /// + /// 获取用户语言到 GFramework 本地化语言码的只读映射表。 + /// + public IReadOnlyDictionary FrameworkLanguageMap => _frameworkLanguageMap; /// /// 解析用户保存的语言值对应的 Godot locale。 @@ -68,4 +91,22 @@ public class LocalizationMap return FrameworkLanguageMap.GetValueOrDefault(storedLanguage, DefaultFrameworkLanguage); } + + private static Dictionary CreateDefaultLanguageMap() + { + return new Dictionary(StringComparer.Ordinal) + { + { "简体中文", "zh_CN" }, + { "English", "en" } + }; + } + + private static Dictionary CreateDefaultFrameworkLanguageMap() + { + return new Dictionary(StringComparer.Ordinal) + { + { "简体中文", "zhs" }, + { "English", "eng" } + }; + } }