【问题标题】:Blazor Component - On change localizationBlazor 组件 - 关于更改本地化
【发布时间】:2021-01-29 00:30:53
【问题描述】:

我为本地化创建了资源文件。在页面加载时,它设置了当前的文化信息,但从下拉列表中更改了语言,它没有改变。

这是我的代码,

Localization.razor:

@page "/"
@using System.Globalization
@using Microsoft.AspNetCore.Localization
@inject IStringLocalizer<Localization> localizer

<h3>@localizer["Title"]</h3>

@localizer["Content"]

<select @onchange="OnSelected">
 <option>Select...</option>
 <option value="en">English</option>
 <option value="de">German</option>
</select>

@code {
   private void OnSelected(ChangeEventArgs e)
   {
      // Code
    
   }
}

在 OnSelected 事件中需要写什么来改变选择的语言?

提前致谢。

MainLayout.razor:

@inherits LayoutComponentBase
@inject NavigationManager NavigationManager

<div class="sidebar">
   <NavMenu />
</div>

<div class="main">
   <div class="top-row px-4">
      <select @onchange="OnSelected">
        <option value="en">English</option>
        <option value="de">German</option>
      </select>
   </div>
 <div class="content px-4">
    @Body
 </div>
</div>

@code {
  private void OnSelected(ChangeEventArgs e)
  {
      var selectedCulture = e.Value.ToString();
      CultureInfo.CurrentUICulture = 
          CultureInfo.GetCultures(CultureTypes.AllCultures)
            .First(c => c.Name == selectedCulture);
   }
}

Localization.razor:

@page "/"
@inject IStringLocalizer<Localization> localizer

<h3>@localizer["Title"]</h3>
@localizer["Content"]

Program.cs:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
        
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Startup.cs:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        
        services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
        var supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("de") };
        services.Configure<RequestLocalizationOptions>(options =>
        {
            options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("de");
            options.SupportedUICultures = supportedCultures;
        });
    }

    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRequestLocalization(app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
        app.UseRouting();

        app.ApplicationServices
            .UseBootstrapProviders()
            .UseFontAwesomeIcons();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
        });
    }
}

【问题讨论】:

标签: blazor


【解决方案1】:

你需要设置当前的文化:

@page "/"
@using System.Globalization
@using Microsoft.AspNetCore.Localization
@inject IStringLocalizer<Localization> localizer

<h3>@localizer["Title"]</h3>

@localizer["Content"]

<select @onchange="OnSelected">
 <option>Select...</option>
 <option value="en">English</option>
 <option value="de">German</option>
</select>

@code {
   private void OnSelected(ChangeEventArgs e)
   {
      // Code
      var selectedCulture = e.Value.ToString();
      CultureInfo.CurrentCulture = CultureInfo.GetCultures(CultureTypes.AllCultures)
                .First(c => c.Name == selectedCulture);
   }
}

【讨论】:

  • 非常感谢。它工作正常 blazor 组件页面并更改为 CultureInfo.CurrentUICulture。假设如果我在 MainLayout.razor 页面中使用相同的代码,在选择事件中,它不会根据其他页面中的所选语言更改文本。请帮我解决这个问题?
  • 您需要通过调用 StateHasChanged 来刷新页面
  • StateHasChanged 也在 MainLayout.razor 组件中使用,但它不起作用。
  • 如果调用 localizer.GetAllStrings() 会怎样?
  • 获取现有资源详细信息而不是最新资源详细信息
猜你喜欢
  • 2020-03-21
  • 2021-12-24
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2022-06-19
相关资源
最近更新 更多