为你的Blazor程序加入本地化多语言功能

news/2025/1/13 19:50:43/文章来源:https://www.cnblogs.com/densen2014/p/18669229

本地化

本地化是为给定语言和地区定制应用程序的过程. BootstrapBlazor 组件允许您将其 UI 元素转换为所需的语言。这包括按钮、过滤器操作符属性等文本。组件内部默认使用当前请求 UI 文化语言,本文将向您展示如何在应用程序中使用此功能:

BootstrapBlazor 组件库

简介
BootstrapBlazor 是一套基于 Bootstrap 和 Blazor 的企业级组件库,可以认为是 Bootstrap 项目的 Blazor 版实现。

小提示

阅读以下知识点前请先查看 微软官方文档
由于 wasm 模式无法获取系统语言文化信息,默认文化信息为 en
组件内置本地化资源文件为 en zh 由网友提供的其他本地化资源文件 de es pt zh-TW 放置在项目文件夹 localization 内,可自行下载通过注入服务引入到项目中

本地化在组件中的工作原理

BootstrapBlazor 组件额外支持使用 Json 类型的键值信息作为资源文件,将其解析为 UI 中呈现的字符串。BootstrapBlazor 包自带以下资源文件。

  • 中文(zh)
  • 英语(en)

额外本地化语言 json 文件

  • 德语(de)
  • 葡萄牙语(pu)
  • 西班牙语(es)
  • 中國台灣(zh-TW)

组件库本地化详细资讯链接

https://www.blazor.zone/localization

开始撸码

跟往常一样,CV福音

源码在此.

Bootstrap Blazor App 模板, 快速搭建项目

  1. 新建bb模板工程
dotnet new install Bootstrap.Blazor.Templates::9.0.4
dotnet new bbapp
  1. 加入语言选择功能

右键新建blazor组件 CultureChooser.razor

新建组件步骤参考往期文章

加入如下代码

@inherits BootstrapComponentBase
@namespace BootstrapBlazor.Server.Components.Components<div @attributes="@AdditionalAttributes" class="@ClassString"><span>@Label</span><Select Value="@SelectedCulture" OnSelectedItemChanged="@SetCulture"><Options>@foreach (var kv in BootstrapOptions.CurrentValue.GetSupportedCultures()){<SelectOption Text="@GetDisplayName(kv)" Value="@kv.Name" />}</Options></Select>
</div>

新建代码后置文件 CultureChooser.razor.cs

新建代码后置文件步骤参考往期文章

using BootstrapBlazor.Components;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;namespace BootstrapBlazor.Server.Components.Components;/// <summary>
/// 
/// </summary>
public partial class CultureChooser
{[Inject][NotNull]private IOptionsMonitor<BootstrapBlazorOptions>? BootstrapOptions { get; set; }[Inject][NotNull]private IStringLocalizer<CultureChooser>? Localizer { get; set; }[Inject][NotNull]private NavigationManager? NavigationManager { get; set; }private string? ClassString => CssBuilder.Default("culture-selector").AddClassFromAttributes(AdditionalAttributes).Build();private string SelectedCulture { get; set; } = CultureInfo.CurrentCulture.Name;[NotNull]private string? Label { get; set; }/// <summary>/// OnInitialized 方法/// </summary>protected override void OnInitialized(){base.OnInitialized();Label ??= Localizer[nameof(Label)];}private async Task SetCulture(SelectedItem item){if (RendererInfo.Name == "Server"){// 使用 api 方式 适用于 Server-Side 模式if (SelectedCulture != item.Value){var culture = item.Value;var uri = new Uri(NavigationManager.Uri).GetComponents(UriComponents.PathAndQuery, UriFormat.SafeUnescaped);var query = $"?culture={Uri.EscapeDataString(culture)}&redirectUri={Uri.EscapeDataString(uri)}";// use a path that matches your culture redirect controller from the previous stepsNavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);}}else{if (SelectedCulture != item.Value){var culture = item.Value;await JSRuntime.InvokeVoidAsync("bbCulture.set", culture);NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true);}}}private string GetDisplayName(CultureInfo culture){string? ret;if (RendererInfo.Name == "Server"){ret = culture.NativeName;}else{ret = culture.Name switch{"zh-CN" => "中文(中国)","en-US" => "English (United States)",_ => ""};}return ret;}
}

  1. 布局文件添加语言选择

编辑 MainLayout.razor 在<Widget></Widget>后面加入一行

<BootstrapBlazor.Server.Components.Components.CultureChooser />

  1. 增加多语言支持配置信息,启用本地化

编辑 Program.cs 在builder.Services.AddBootstrapBlazor();后加入这些代码

// 增加多语言支持配置信息
builder.Services.AddRequestLocalization<IOptionsMonitor<BootstrapBlazorOptions>>((localizerOption, blazorOption) =>
{blazorOption.OnChange(Invoke);Invoke(blazorOption.CurrentValue);return;void Invoke(BootstrapBlazorOptions option){var supportedCultures = option.GetSupportedCultures();localizerOption.SupportedCultures = supportedCultures;localizerOption.SupportedUICultures = supportedCultures;}
});builder.Services.AddControllers();

然后在var app = builder.Build();后加入这行代码

// 启用本地化
var option = app.Services.GetService<IOptions<RequestLocalizationOptions>>();
if (option != null)
{app.UseRequestLocalization(option.Value);
}

最后在app.MapStaticAssets();后加入这行代码

app.MapDefaultControllerRoute();
  1. 添加控制器

新建文件夹Controllers, 新建文件 CultureController.cs

using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using RouteAttribute = Microsoft.AspNetCore.Mvc.RouteAttribute;namespace BootstrapBlazor.Controllers;/// <summary>
/// 文化 Controller
/// </summary>
[Route("[controller]/[action]")]
public class CultureController : Controller
{/// <summary>/// 设置文化方法/// </summary>/// <param name="culture"></param>/// <param name="redirectUri"></param>/// <returns></returns>public IActionResult SetCulture(string culture, string redirectUri){if (string.IsNullOrEmpty(culture)){HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);}else{HttpContext.Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName,CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture, culture)), new CookieOptions(){Expires = DateTimeOffset.Now.AddYears(1)});}return LocalRedirect(redirectUri);}/// <summary>/// 重置文化方法/// </summary>/// <param name="redirectUri"></param>/// <returns></returns>public IActionResult ResetCulture(string redirectUri){HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);return LocalRedirect(redirectUri);}
}
  1. 运行工程

因为模板工程已经带了部分多语言配置, 我们点击Table或者花名册页面就可以看到效果

  1. 实践

通过主页面改变欢迎词来练习

代码<SurveyPrompt Title="How is Blazor working for you?" />改为

<SurveyPrompt Title="@Localizer["Wellcome"]" />
<SurveyPrompt Title="@Localizer["How is Blazor working for you?"]" />@code{[Inject][NotNull]private IStringLocalizer<Index>? Localizer { get; set; }}

在这里我们写了两行@Localizer,先买个关子,运行时候看看是什么效果.

添加本地化资源

分别在Locales/zh.jsonLocales/en.json添加对应的文字

  "BootstrapBlazorApp.Server.Components.Pages.Index": {"Wellcome": "Blazor 对你有什么帮助?"}
  "BootstrapBlazorApp.Server.Components.Pages.Index": {"Wellcome": "How is Blazor working for you?"}

运行工程

现在可以看到效果了, 找到资源的已经正确显示对应文本, 未找到资源的,会回落显示为key.

  1. 组件库本地化详细资讯链接

https://www.blazor.zone/localization

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868706.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024ICPC(香港)游记

转自MyBlog 虽然2025了再写好像有点迟就是了。 day -180? 大一xdx太nb导致的,本来预估网络赛400有两场,600校内出线,结果被xdx搞成网络赛200有两场,400校内出线。632遗憾退场。 day -100? 老师给南京站争取了一个外卡,可惜20分罚时之差给了我们前一队。这么说去年邀请赛…

AVL树的插入

关于AVL树的插入,其实是一个比较复杂的问题,主要是在于他对于“旋转”这一概念,对于这一概念其实我感觉很多博主讲的都不是很明白,包括CHATGPT,也试了,但是也没有比较清楚的解释,他们主要集中在一种比较简单的情况,即没有任何子树的情况,如下所示 ​​ 对于这种最基本…

【事件分析】20250112-Usual 赎回机制调整事件

背景信息 https://docs.usual.money/ Usual 是一个聚合 RWA 的稳定币发行协议,经济模型中存在三种代币:USD0:Usual 发行的稳定币。 USD0++:USD0++ 是 USD0 的质押版本,为期4年,可获得 USUAL 代币奖励。 USUAL:Usual 协议的治理代币。事发缘由 https://usual.money/blog/…

痞子衡嵌入式:我评上了2024年度电子星球(eestar)最强大脑

今天收到了「电源网旗下电子星球」 颁发的 2024 年度最强大脑奖牌,这是电子星球第二年给痞子衡颁奖了。这个奖牌设计得非常用心,区别于去年奖牌只能捧在手上,今年痞子衡可以把奖牌挂脖子上出去拉风了。从23年8月开始,电子星球小编每个工作日会转发一篇痞子衡的技术原创文章…

React源码解析(1): JSX语法与react项目渲染过程

好家伙0.前言 由于工作的需要,我不得不入手了react的全家桶,曾经我的主要技术栈是vue。 从vue转到react,一开始我感到非常不适应,jsx的语法的不了解,react hooks的使用方式,react路由的配置。。。这一度让我十分难受 但在熟悉一段时间后,我逐渐领略到react的魅力,灵活的…

痞子衡嵌入式:我拿到了2024年度电子星球(eestar)最强大脑

今天收到了「电源网旗下电子星球」 颁发的 2024 年度最强大脑奖牌,这是电子星球第二年给痞子衡颁奖了。这个奖牌设计得非常用心,区别于去年奖牌只能捧在手上,今年痞子衡可以把奖牌挂脖子上出去拉风了。从23年8月开始,电子星球小编每个工作日会转发一篇痞子衡的技术原创文章…

使用嗅探大师(sniff master)进行手机端iOS抓包的配置步骤

一个强大的iOS端抓包工具,嗅探大师(sniff master),比市面上的一些抓包工具操作更简单。之前做网页端开发的时候找到一个抓包工具,嗅探大师,当时用来在Windows上面进行抓包,发现他在手机端iOS方面的抓包更为强大,而且还有HTTPS暴力抓包,无需设置代理,无需越狱,无需ro…

keycloak~巧用client-scope实现token字段和userinfo接口的授权

keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块…

.NET Core 委托原理解析

.NET Core 委托原理解析 在 .NET Core 中,委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递给其他方法,或者将方法存储在变量中以便稍后调用。委托在事件处理、回调机制以及异步编程中非常有用。理解委托的运行原理对于掌握 .NET Core 的高级编程技巧至…

Ellyn-Golang调用级覆盖率&方法调用链插桩采集方案

在应用程序并行执行的情况下,精确获取单个用例、流量、单元测试走过的方法链(有向图)、出入参数、行覆盖等运行时数据,经过一定的加工之后,应用在覆盖率、影响面评估、流量观测、精准测试、流量回放、风险分析等研发效能相关场景。词语解释Ellyn要解决什么问题? 在应用程…

[megatron代码阅读] 1. 初始化和组网

以pretrain_gpt.py为例, 看megatron的整体逻辑. 本章主要包括megatron初始化相关逻辑, 核心函数为initialize_megatron, setup_model_and_optimizer两个 initialize_megatron parse_args 从argparse中直接读取超参数配置. 如学习率, 正则化等. 从环境变量中获取rank等 load_arg…

巧用VTable打造炫酷金字塔图表

在数据分析和可视化领域,表格是展示数据直观、有效的方式之一。今天,就让我们来探索如何利用VTable这个强大的表格组件,制作出既美观又富有信息量的金字塔图表,以及深入了解VTable中各种单元格类型的使用方法,让你的表格也能“绘”出精彩图表!在数据分析和可视化领域,表…