// Copyright (c) 2026 GeWuYou // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using GFramework.Core.Abstractions.Localization; using GFramework.Core.Architectures; using GFramework.Game.Abstractions.Setting; using GFramework.Game.Abstractions.Setting.Data; using GFramework.Godot.Setting.Data; namespace GFramework.Godot.Setting; /// /// Godot 本地化设置类,负责将持久化语言配置同时应用到 Godot 引擎与 GFramework 本地化管理器。 /// public class GodotLocalizationSettings : IResetApplyAbleSettings { private readonly Action _applyGodotLocale; private readonly Func _localizationManagerResolver; private readonly LocalizationMap _localizationMap; private readonly ISettingsModel _model; /// /// 初始化 Godot 本地化设置应用器,并默认从当前架构上下文解析框架本地化管理器。 /// /// 设置模型。 /// 本地化映射表。 public GodotLocalizationSettings(ISettingsModel model, LocalizationMap localizationMap) : this(model, localizationMap, TryResolveLocalizationManager, TranslationServer.SetLocale) { } /// /// 初始化 Godot 本地化设置应用器。 /// /// 设置模型。 /// 本地化映射表。 /// 框架本地化管理器解析器。 public GodotLocalizationSettings( ISettingsModel model, LocalizationMap localizationMap, Func localizationManagerResolver) : this(model, localizationMap, localizationManagerResolver, TranslationServer.SetLocale) { } /// /// 初始化 Godot 本地化设置应用器,并显式指定 Godot locale 应用动作。 /// 该重载主要用于测试或自定义引擎桥接。 /// /// 设置模型。 /// 本地化映射表。 /// 框架本地化管理器解析器。 /// Godot locale 应用动作。 public GodotLocalizationSettings( ISettingsModel model, LocalizationMap localizationMap, Func localizationManagerResolver, Action applyGodotLocale) { _model = model ?? throw new ArgumentNullException(nameof(model)); _localizationMap = localizationMap ?? throw new ArgumentNullException(nameof(localizationMap)); _localizationManagerResolver = localizationManagerResolver ?? throw new ArgumentNullException(nameof(localizationManagerResolver)); _applyGodotLocale = applyGodotLocale ?? throw new ArgumentNullException(nameof(applyGodotLocale)); } /// /// 应用本地化设置到 Godot 引擎与 GFramework 本地化管理器。 /// /// 完成的任务 public Task Apply() { var settings = _model.GetData(); var locale = _localizationMap.ResolveGodotLocale(settings.Language); var frameworkLanguage = _localizationMap.ResolveFrameworkLanguage(settings.Language); _applyGodotLocale(locale); // 设置系统持久化的是用户可见语言值;这里需要同步框架语言码,避免 Godot 与框架状态分裂。 _localizationManagerResolver()?.SetLanguage(frameworkLanguage); return Task.CompletedTask; } /// /// 重置本地化设置 /// public void Reset() { _model.GetData().Reset(); } /// /// 获取本地化设置的数据对象。 /// 该属性提供对本地化设置数据的只读访问。 /// public ISettingsData Data => _model.GetData(); /// /// 获取本地化设置数据的类型。 /// 该属性返回本地化设置数据的具体类型信息。 /// public Type DataType { get; } = typeof(LocalizationSettings); private static ILocalizationManager? TryResolveLocalizationManager() { try { return GameContext.GetFirstArchitectureContext().GetSystem(); } catch (InvalidOperationException) { return null; } } }