1. 前言
原理:在Blazor Server程序中,因为用户不能修改服务器端运行的网站程序的Culture,所以不能直接使用resx中的字条。需要在ResourceManager中手动指定Culture。
为了能思路清晰,先简单实现,再考虑特殊情况进行处理。
2. 创建资源文件,主文件Resource.resx,修改为public访问,中文为Resource.zh-CN.resx :
3. 编写组件基类:
public class MyComponentBase:ComponentBase, IHandleEvent
{
[Parameter]
public string Lang { get; set; }
public string L(string key)
{
return Resource.ResourceManager.GetString(key, new CultureInfo(Lang));
}
}
4. 修改Index.razor :
@page "/{lang}/"
@inherits MyComponentBase
<h1>@L(nameof(Resource.Hello))</h1>
5. 运行查看效果
6. 没有定义路由的自定义组件:
在其他自定义组件中,因为没有路由,所以Lang会为空,此时可用全局的RouteData来获取:
在App.razor中:
...
<CascadingValue Value="@routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</CascadingValue>
...
修改组件基类:
public class MyComponentBase: ComponentBase, IHandleEvent
{
[CascadingParameter]
public RouteData RouteData { get; set; }
[Parameter]
public string Lang { get; set; }
public string L(string key)
{
if (string.IsNullOrEmpty(Lang))
{
Lang = RouteData.RouteValues["lang"].ToString();
}
return Resource.ResourceManager.GetString(key, new CultureInfo(Lang));
}
}
编写一个MyComponent.razor 组件:
@inherits MyComponentBase
<h3>From Component:@L(nameof(Resource.Hello))</h3>
修改index.razor:
@page "/{lang}/"
@inherits MyComponentBase
<h1>@L(nameof(Resource.Hello))</h1>
<MyComponent ></MyComponent>
测试:
7. 参考:
(1). https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-5.0
8. 源程序
https://download.csdn.net/download/ljfblog/15760625