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

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

时间:2025-01-13 19:54:33浏览次数:1  
标签:string BootstrapBlazor 本地化 程序 private culture using Blazor

本地化

本地化是为给定语言和地区定制应用程序的过程. 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 steps
                NavigationManager.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

标签:string,BootstrapBlazor,本地化,程序,private,culture,using,Blazor
From: https://www.cnblogs.com/densen2014/p/18669229

相关文章

  • 小程序 校园求职交友APP
    文章目录项目和技术介绍具体实现截图uniapp+hbuilderx错误处理和异常处理小程序框架以及目录结构介绍系统安全性java类核心代码部分展示软件测试数据完整性源码获取/详细视频演示项目和技术介绍微信开发者工具/hbuiderx后端语言支持以下技术栈:1java(SSM/springbo......
  • 【最新原创毕设】基于SSM的在线学习平台+09650(免费领源码)可做计算机毕业设计JAVA、PHP
    目 录摘要1绪论1.1选题背景及意义1.2国内外现状分析1.3论文结构与章节安排2 在线学习平台系统分析2.1可行性分析2.2系统业务流程分析2.3系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4系统用例分析2.5本章小结3在线学习平台总体设......
  • PTA 团体程序设计天梯赛 15分题 048
    L1-048矩阵A乘以B(15)题目要求给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。输入格式输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中......
  • 2025毕设ssm解忧暖心喵程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着现代社会的快速发展,人们面临着各种各样的压力,心理健康问题日益凸显。特别是在校园环境中,学生和辅导员都可能会遭遇不同程度的心理困扰。在这......
  • 2025毕设ssm梨园票友社交网站程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着传统文化的复兴,戏曲作为中国传统文化的瑰宝,受到越来越多的关注。然而,传统的戏曲传播和交流方式受到地域、时间等限制。梨园票友群体虽然热爱......
  • 2025毕设ssm煤炭资源交易竞拍平台程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景煤炭作为全球重要的能源资源,在能源供应和经济发展中占据着关键地位。然而,传统的煤炭交易方式面临诸多问题,例如信息不对称,交易双方难以获取全面准......
  • 2025毕设ssm民宿管理系统设计程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着旅游业的蓬勃发展,民宿作为一种新兴的住宿形式日益受到游客的欢迎。传统的住宿模式已经无法满足人们对于个性化、特色化住宿体验的追求,民宿凭......
  • 2025毕设ssm客户资源管理系统程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今竞争激烈的商业环境中,企业的成功与否在很大程度上取决于其对客户资源的管理能力。随着市场的不断扩大和客户需求的日益多样化,企业所面临的......
  • 2025毕设ssm驾校管理程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会经济的发展,汽车已经成为人们日常生活中不可或缺的交通工具,这使得越来越多的人有学习驾驶技能的需求,驾校行业规模不断扩大。然而,传统的驾......
  • 2025年flask二手汽车交易网站 程序+论文 可用于计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网的普及和电子商务的快速发展,二手车交易逐渐从线下转向线上,二手汽车交易网应运而生。然而,尽管市场上已存在多个二手汽车交易平台......