首页 > 其他分享 >Blazor学习之旅(10)多语言+本地化

Blazor学习之旅(10)多语言+本地化

时间:2023-08-02 09:01:07浏览次数:38  
标签:10 zh 语言 本地化 Culture Blazor 页面

大家好,我是Edison。

上一篇我提到了接下来会介绍一下如何在Blazor中实现多语言,这就安排上了。

多语言+本地化的背景

在Web应用开发中,我们可能会有一些需要多语言+本地化的场景,特别在一些国际化的外资企业当中特别常见。例如,Edison所在的IT开发团队,就需要英语,中文和德语三种语言的支持,用户可以通过“切换页面语言”这个功能来切换到适合他的语言来浏览页面的内容。因此,为Web应用提供多语言,页面内容可以本地化,会扩展我们的IT系统受众范围,提升一点用户体验。

因此,如何在Blazor中实现多语言+本地化就被提上议程。

一些基本的名词术语

为了更好地理解下面的内容,我们先来了解一下行业内通用的名词术语:

  • Globalization (G11N):全球化,即使应用支持不同语言和区域的过程。G11N 是首字母、尾字母和它们之间字母的个数组成的,下同,不再赘述。

  • Localization (L10N):本地化,即针对特定语言和区域自定义全球化应用的过程。

  • Internationalization (I18N):国际化,又称为多语言,包含了全球化和本地化。

  • Culture:区域性,即一种语言文化或区域。

  • Neutral Culture:非特定区域性,即具有指定语言但不具有区域的区域性。例如“zh”、“en”,仅仅表示中文或英文,并没有包含指定地区,如大陆、香港、台湾等。

  • Specific Culture: 特定区域性,即具有指定语言和区域的区域性。例如“zh-CN”、“zh-HK”。

  • Parent Culture: 父区域性,例如“zh”就是“zh-CN”和“zh-HK”的父区域性。

在Blazor中实现本地化的方式

在Blaozr中实现本地化的方式,其实也就是ASP.NET Core提供的那些本地化工具:

  • IStringLocalizer

  • IStringLocalizerFactory

  • IHtmlLocalizer

  • IViewLocalizer

在Blazor中,我们最常用的就是IStringLocalizer,它可以在运行时提供区域性资源,使用非常简单,就像操作字典一样,提供一个 Key,就能获取到指定区域的资源。

接下来,我就以IStringLocalizer为例,介绍如何通过它来在Blazor应用中实现多语言和本地化。

在Blazor中实现本地化的步骤

(1)准备工作

假设我们已经有了一个Blazor应用程序,并且有一个Home.razor的页面,需要支持中文(默认语言)、英语和德语。

(2)创建三个资源文件

在根目录下创建一个Resources目录,再创建一个Pages子目录,然后再创建三个resx资源文件。这里我们可以使用一个资源文件来覆盖所有页面的本地化内容,也可以针对多个页面配置多个资源文件。为了演示,这里只有一个资源文件Home.resx应对演示页面Home.razor。

key:HelloWorldTip, value: 你好,世界      -- 中文
key:HelloWorldTip, value: Hello, World!  -- 英语
key:HelloWorldTip, value: Hallo, welt!   -- 德语

补充:如果你习惯使用json作为资源文件,也可以使用My.Extensions.Localization.Json 这个包来将resx换为json文件。

(3)在Programs.cs中注册和使用本地化

添加本地化服务,并指向我们刚刚创建的Resources目录,并声明系统需要支持三种语言,中文为默认的语言。

var builder = WebApplication.CreateBuilder(args);
......
// Add Localization
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

var app = builder.Build();
......
app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

// Use Localization
const string CULTURE_CHINESE = "zh-CN";
const string CULTURE_ENGLISTH = "en-US";
const string CULTURE_GERMAN = "de-DE";
app.UseRequestLocalization(options =>
{
    var cultures = new[] { CULTURE_CHINESE, CULTURE_ENGLISTH, CULTURE_GERMAN };
    options.AddSupportedCultures(cultures);
    options.AddSupportedUICultures(cultures);
    options.SetDefaultCulture(CULTURE_CHINESE);
    // 当Http响应时,将 当前区域信息 设置到 Response Header:Content-Language 中
    options.ApplyCurrentCultureToResponseHeaders = true;
});
......

(4)在_Imports.razor中添加全局注入

为了方便后续的使用,我们直接将IStringLocalizer和NavigationManager进行全局的注入。

......
@using Microsoft.AspNetCore.Localization
@using System.Globalization

@inject IStringLocalizer<Home> _translator;
@inject NavigationManager _navigation;
......

(5)新建一个CultureController用于Culture的切换

为了让页面上的语言切换能够更新系统的当前Culture,我们让其通过调用API的方式来实现。

namespace EDT.BlazorServer.App.Controllers
{
    [Route("[controller]/[action]")]
    public class CultureController : Controller
    {
        public IActionResult Set(string culture, string redirectUri)
        {
            if (!string.IsNullOrEmpty(culture))
            {
                HttpContext.Response.Cookies.Append(
                    CookieRequestCultureProvider.DefaultCookieName,
                    CookieRequestCultureProvider.MakeCookieValue(
                      new RequestCulture(culture, culture)), 
                      new CookieOptions { Secure = true, HttpOnly = true });
            }

            return LocalRedirect(redirectUri);
        }
    }
}

(6)改造Home.razor让其可以实现本地化

这里我们在页面上使用IStringLocalizer对象来实现一个内容的切换。

@page "/home"

<PageTitle>Index</PageTitle>

<h1>@_translator["HelloWorldTip"]</h1>
<p>
    <label>
        Select your locale:
        <select @bind="Culture">
            @foreach (var culture in supportedCultures)
            {
               <option value="@culture">@culture.DisplayName</option>
            }
        </select>
    </label>
</p>

@code {
    private CultureInfo[] supportedCultures = new[]
    {
        new CultureInfo("zh-CN"),
        new CultureInfo("en-US"),
        new CultureInfo("de-DE")
    };

    protected override void OnInitialized()
    {
        Culture = CultureInfo.CurrentCulture;
    }

    public CultureInfo Culture 
    {
        get => CultureInfo.CurrentCulture;
        set
        {
            if (CultureInfo.CurrentCulture != value)
            {
                var uri = new Uri(_navigation.Uri)
                    .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
                var cultureEscaped = Uri.EscapeDataString(value.Name);
                var uriEscaped = Uri.EscapeDataString(uri);

                _navigation.NavigateTo(
                    $"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
                    forceLoad: true);
            }
        }
    }
}

(7)效果演示

如下图所示:

小结

本篇,我们在Blazor中通过IStringLocalizer来实现了多语言和本地化。但其实IStringLocalizer只是ASP.NET Core中本地化实现方式的一种而已,关于更多全球化和本地化的内容,建议阅读参考资料中的两篇文章,特别是建军兄最近整理的《理解ASP.NET Core - 全球化与本地化》值得一读!

参考代码

GitHub:https://github.com/Coder-EdisonZhou/BlazorSamples/tree/main

参考资料

Microsoft,《ASP.NET Core Blazor 全球化与本地化》

xiaoxiaotank,《理解ASP.NET Core - 全球化与本地化》(五星推荐)

 

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

标签:10,zh,语言,本地化,Culture,Blazor,页面
From: https://www.cnblogs.com/edisonchou/p/edc_aspnet_blazor_learning_chap10.html

相关文章

  • 基于ResNet-101深度学习网络的图像目标识别算法matlab仿真
    1.算法理论概述       介绍ResNet-101的基本原理和数学模型,并解释其在图像识别中的优势。然后,我们将详细介绍如何使用深度学习框架实现ResNet-101,并在图像数据集上进行训练和测试。最后,我们将总结本文的主要内容并提出进一步的研究方向。 1.1、ResNet-101的基本原理......
  • 代码随想录算法训练营第四十一天| 1143.最长公共子序列 1035.不相交的线 53. 最大
    1143.最长公共子序列  要求:可以跳过,找出来最长符合的节点难点:如何跳过了之后仍然保留之前的值思路:如果不符,并不是dp[i-1][j-2]等于之前的值,而是dp[i][j]等于它的相关节点以上很重要代码:1//要求:两个子数组,可以删减跳过,找出最长的长度2//思路:dp[n][m]代表第......
  • The 10th Shandong Provincial Collegiate Programming Contest
    The10thShandongProvincialCollegiateProgrammingContestK-HappyEquation思路:a,x的奇偶性相同(因为都对偶数取模),且打表得出a为奇数时,答案为1。(¿)a为偶数时,令a=t1*2q  → ax=t1x*2qx若axmod2p为0,则qx>=p,x>=p/q;由于q>=1(a为偶数),则x>=p;x与a同为偶数,令x'=t2*2k→x'a......
  • 不忘初心 Windows11 Insider Preview 25915.1000 Canary预览版 无更新 纯净精简 2023.
    此版不能更新补丁,并开启按流量计费,此版保留Hyper和linux,让人期待的任务栏图标从不合并功能此版已经回归,母版来自UUPWindows11InsiderPreview25915.1000Canary频道预览版,本版本自动跳过硬件检测,优化后台进程和服务,精简一些日常不常用的组件,速度和性能比原版更胜一筹,为了保证稳......
  • c语言学习10
    结构:结构是由程序员自己设计的一种数据类型,用于描述一种事物的各项数据,由若干个不同的基础类型组成设计:struct结构体类型名{类型名成员名;...};定义:struct结构体类型名结构体变量名;注意:C语言中在定义结构变量时,struct关键字不能省略初始化:......
  • 禁用Win10更新,禁用Win11更新,更彻底的关闭系统更新
    新建一个bat文件填充以下内容::WindowsauomaticupdatesregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vAutoInstallMinorUpdates/tREG_DWORD/d1/fregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vNoAutoUpda......
  • 电脑Windows 10/11中如何设置HTTP代理
     嗨,亲爱的网络探索者!是否曾遇到无法访问特定网站或慢如蜗牛的网络速度?别担心!今天我将与你分享一个简单而有效的方法——设置HTTP代理,让你畅享网络的自由与速度。让我们一起来学习,在Windows10/11中如何设置HTTP代理。 第一步:找到网络设置 首先,我们需要前往电脑的网络设置......
  • Windows 10, version 22H2 (updated Jul 2023) 中文版、英文版下载
    Windows10,version22H2(updatedJul2023)中文版、英文版下载Windows1022H2企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-10/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows10更新历史记录Windows10,version22H2,alledit......
  • 月工资不到10元的内容审核专员? - ChatGPT 在内容自动审查中的应用
    内容过滤筛查是指对网络上发布或传播的文本、图片、视频等内容进行审核和监管,以防止出现违法违规、暴力色情、虚假广告、电信诈骗等现象,维护网络安全和社会秩序。内容过滤筛查是一个亟待解决的问题,因为网络内容的数量庞大,且具有多样性、动态性和隐晦性。对于处理用户数据的软件或......
  • day10
    面向对象程序设计1940年以前:面向机器——二进制码、汇编面向过程——COBOL、FORTRAN、BASIC、C语言等结构化程序设计——抛弃goto语句,采取“自顶向下、逐步细化、模块化”的指导思想。结构化程序设计本质上还是一种面向过程的设计思想,但通过“自顶向下、逐步细化、模块......