Blazor中的Localization

参考连接

1.根据浏览器语言显示语言

  1. 项目中新建Resources文件夹

  2. 新建Text.resx文件(这个不用加语言的后缀,会报错 自定义工具 PublicResXFileCodeGenerator 未能对输入文件产生输出)

  3. 新建其他语言的Text文件,比如Text.zh.resx

  4. resx文件中访问修饰符需要设置 public,每个文件中的名称需要相同,值是各个语言

  5. 完成之后,类似下图

  6. Program.cs中添加 builder.Services.AddLocalization();

  7. _Imports.razor中添加

    • @using Microsoft.Extensions.Localization
    • @using 项目名.文件夹名称,例如:@using BlazorWasmLocalization.Shared.ResourceFiles
  8. 在页面中添加代码,其中Text就是resx文件的名称

1
2
3
4
5
@page "/"
@inject IStringLocalizer<Text> localizer

<h1>@localizer["resx文件中的一个名称"]</h1>
@localizer["resx文件中的一个名称"]

2.根据用户选择的语言显示语言

  1. 可以新建一个组件也可以直接在页面中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!-- 下拉选框 -->
<strong>Culture:</strong>

<select class="form-control" @bind="Culture" style="width:300px; margin-left:10px;">
@foreach (var culture in cultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>

<!-- 组件代码 -->
public partial class CultureSelector
{
[Inject]
public NavigationManager NavManager { get; set; }

[Inject]
public IJSRuntime JSRuntime { get; set; }

<!-- 语言列表,和resx文件对应 -->
CultureInfo[] cultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("zh-CN")
};

CultureInfo Culture
{
get => CultureInfo.CurrentCulture;
set
{
if (CultureInfo.CurrentCulture != value)
{
var js = (IJSInProcessRuntime)JSRuntime;
js.InvokeVoid("blazorCulture.set", value.Name);
<!-- 每次选择之后会刷新一下页面 -->
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
}
}
}
}
  1. 在项目下新建一个 Extensions文件夹,新建一个 WebAssemblyHostExtension.cs文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class WebAssemblyHostExtension
{
public async static Task SetDefaultCulture(this WebAssemblyHost host)
{
var jsInterop = host.Services.GetRequiredService<IJSRuntime>();
var result = await jsInterop.InvokeAsync<string>("blazorCulture.get");

CultureInfo culture;

if (result != null)
culture = new CultureInfo(result);
else
culture = new CultureInfo("zh-CN");

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
}
}
  1. Program.cs中添加
1
2
3
var host = builder.Build();
await host.SetDefaultCulture();
await host.RunAsync();
  1. wwwroot/index.html中添加
1
2
3
4
5
6
<script>
blazorCulture = {
get: () => localStorage['BlazorCulture'],
set: (value) => localStorage['BlazorCulture'] = value
};
</script>
  1. 在csproj文件中添加
1
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
  1. 运行即可