Skip to content

Commit 24e09c0

Browse files
authored
feat:accept language handler (#791)
* 调整导航项的内边距以优化布局 修改了 `.masa-stack-components .global-nav .nav .action-item` 的 `padding` 属性,将左内边距从 `24px` 调整为 `28px`。 修改了 `.masa-stack-components .global-nav .nav .action-item2` 的 `padding` 属性,将左内边距从 `32px` 调整为 `40px`。 * 重构搜索功能以使用绑定和新事件处理 在 `GlobalNavigation.razor` 中,将 `SSearch` 组件的 `ValueChanged` 属性替换为 `@bind-Value`,并添加了 `OnEnter` 事件处理程序以改进用户交互。 在 `GlobalNavigation.razor.cs` 中,重构了 `VisibleChanged` 方法,移除了 `SearchChanged(null);`,改为将 `_search` 设为空字符串并调用 `OnEnter()` 方法。 重命名 `SearchChanged` 方法为 `OnEnter`,并调整其逻辑以使用 `_search` 作为参数。 * 修复导航逻辑并添加空状态提示 修复了导航逻辑,增加了对 `Value.Children` 是否为空的判断,仅在 `Value.Children` 不为空时渲染导航内容。 当 `Value.Children` 为空时,新增了一个居中的空状态组件 `MEmptyState`,提供用户友好的提示信息。 空状态组件包含标题、文本、图标和大小设置,并通过样式实现居中显示。 * 优化组件文本和按钮行为 在 `ExpansionMenuWrapper.razor` 中: - 将 `<MEmptyState>` 的 `Title` 和 `Text` 属性从硬编码改为动态翻译。 在 `GlobalNavigation.razor` 中: - 用 `<SBtn>` 替换 `<SAutoLoadingButton>`,新增 `OnClickStopPropagation` 属性。 - 保留 `<SIcon>` 的功能,用于显示取消收藏提示。 * 添加 Accept-Language 支持及相关优化 新增 AcceptLanguageHandler 和 AcceptLanguageHandlerFilter,用于全局自动添加 Accept-Language 请求头,支持多语言环境。 在 ServiceCollectionExtensions 中注册相关服务,并通过 IHttpMessageHandlerBuilderFilter 实现全局语言头处理器。 修复 ExpansionMenuWrapper.razor 的代码块闭合问题。 更新 _Imports.cs,添加必要的全局引用以支持新功能。 * 移除无用注释以优化代码可读性 移除了 `ServiceCollectionExtensions.cs` 文件中 `ServiceCollectionExtensions` 类的一行无用注释。 保留了所有服务注册逻辑,功能未受影响,仅提升了代码的整洁性和可读性。
1 parent 240eb01 commit 24e09c0

File tree

5 files changed

+95
-1
lines changed

5 files changed

+95
-1
lines changed

src/Masa.Stack.Components/Extensions/ServiceCollectionExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ private static void AddMasaStackComponentsService(IServiceCollection services, M
3636
services.TryAddScoped<LocalStorage>();
3737
services.TryAddScoped<JsInitVariables>();
3838

39+
// 注册 Accept-Language 处理器
40+
services.AddScoped<AcceptLanguageHandler>();
41+
42+
// .NET 6/7: 使用 IHttpMessageHandlerBuilderFilter 实现相同效果
43+
services.AddSingleton<IHttpMessageHandlerBuilderFilter, AcceptLanguageHandlerFilter>();
44+
3945
// 注册团队状态管理器 - 根据运行时环境选择合适的实现
4046
services.AddScoped<ITeamStateManager>(sp =>
4147
{
@@ -80,6 +86,7 @@ private static void AddMasaStackComponentsService(IServiceCollection services, M
8086
authHost ??= masaStackConfig.GetAuthServiceDomain();
8187
mcHost ??= masaStackConfig.GetMcServiceDomain();
8288
pmHost ??= masaStackConfig.GetPmServiceDomain();
89+
8390
services.AddDccClient(dccHost);
8491
services.AddAuthClient(authHost);
8592
services.AddSingleton(new McServiceOptions(mcHost));
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
namespace Masa.Stack.Components.Infrastructure.Http;
2+
3+
/// <summary>
4+
/// HTTP 消息处理器,用于自动为请求添加 Accept-Language 头
5+
/// </summary>
6+
public class AcceptLanguageHandler : DelegatingHandler
7+
{
8+
private readonly I18n _i18n;
9+
10+
public AcceptLanguageHandler(I18n i18n)
11+
{
12+
_i18n = i18n;
13+
}
14+
15+
protected override async Task<HttpResponseMessage> SendAsync(
16+
HttpRequestMessage request,
17+
CancellationToken cancellationToken)
18+
{
19+
// 从当前 I18n 获取语言设置
20+
var culture = _i18n.Culture.Name;
21+
22+
// 设置 Accept-Language 头(后端根据这个判断返回什么语言)
23+
// 包含降级语言,确保后端总能找到合适的语言
24+
if (!request.Headers.Contains("Accept-Language"))
25+
{
26+
var acceptLanguage = BuildAcceptLanguageHeader(culture);
27+
request.Headers.Add("Accept-Language", acceptLanguage);
28+
}
29+
30+
return await base.SendAsync(request, cancellationToken);
31+
}
32+
33+
/// <summary>
34+
/// 构建 Accept-Language 头,包含降级语言
35+
/// </summary>
36+
/// <param name="culture">当前文化,如 zh-CN, en-US</param>
37+
/// <returns>Accept-Language 头值,如 "zh-CN,zh;q=0.9,en;q=0.8"</returns>
38+
private static string BuildAcceptLanguageHeader(string culture)
39+
{
40+
var languages = new List<string>
41+
{
42+
// 1. 添加完整的文化代码(优先级 1.0,最高)
43+
culture
44+
};
45+
46+
// 2. 如果是特定区域的语言(如 zh-CN),添加通用语言(如 zh)
47+
if (culture.Contains("-"))
48+
{
49+
var languageOnly = culture.Split('-')[0];
50+
languages.Add($"{languageOnly};q=0.9");
51+
}
52+
53+
// 3. 添加英语作为通用降级语言(如果当前不是英语)
54+
if (!culture.StartsWith("en", StringComparison.OrdinalIgnoreCase))
55+
{
56+
languages.Add("en;q=0.8");
57+
}
58+
59+
return string.Join(",", languages);
60+
}
61+
}
62+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Microsoft.Extensions.Http;
2+
3+
namespace Masa.Stack.Components.Infrastructure.Http;
4+
5+
/// <summary>
6+
/// HttpMessageHandler 构建过滤器,用于全局添加 AcceptLanguageHandler
7+
/// 在 .NET 6/7 中实现类似 ConfigureHttpClientDefaults 的效果
8+
/// </summary>
9+
internal class AcceptLanguageHandlerFilter : IHttpMessageHandlerBuilderFilter
10+
{
11+
public Action<HttpMessageHandlerBuilder> Configure(Action<HttpMessageHandlerBuilder> next)
12+
{
13+
return builder =>
14+
{
15+
// 先执行下一个过滤器
16+
next(builder);
17+
18+
// 添加 AcceptLanguageHandler 到所有 HttpClient
19+
builder.AdditionalHandlers.Add(builder.Services.GetRequiredService<AcceptLanguageHandler>());
20+
};
21+
}
22+
}
23+

src/Masa.Stack.Components/Shared/GlobalNavigations/ExpansionMenuWrapper.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ else
4545
Size="100">
4646
</MEmptyState>
4747
</div>
48-
}
48+
}

src/Masa.Stack.Components/_Imports.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
global using Masa.Stack.Components.Configs;
2323
global using Masa.Stack.Components.Extensions;
2424
global using Masa.Stack.Components.Infrastructure;
25+
global using Masa.Stack.Components.Infrastructure.Http;
2526
global using Masa.Stack.Components.Infrastructure.Identity;
2627
global using Masa.Stack.Components.Layouts;
2728
global using Masa.Stack.Components.Models;
@@ -42,6 +43,7 @@
4243
global using Microsoft.Extensions.Configuration;
4344
global using Microsoft.Extensions.DependencyInjection;
4445
global using Microsoft.Extensions.DependencyInjection.Extensions;
46+
global using Microsoft.Extensions.Http;
4547
global using Microsoft.Extensions.Logging;
4648
global using Microsoft.JSInterop;
4749
global using System.Collections.Concurrent;

0 commit comments

Comments
 (0)