【问题标题】:Globalization and Localization in Blazor Server AppBlazor Server 应用程序中的全球化和本地化
【发布时间】:2021-02-08 01:17:18
【问题描述】:

如何在 Blazor Server App 中进行全球化和本地化?

无法在 Blazor Server 应用程序中找到全球化和本地化的工作示例, 我已经创建了一个我自己的。这是代码示例。复制并测试...

【问题讨论】:

    标签: localization blazor blazor-server-side


    【解决方案1】:
    1. 创建一个文件夹并将其命名为资源

    2. 将以下资源文件(.resx)添加到文件夹中 Pages.Index.resx:将字符串 Greetings 添加到 Name 列和 Hello!到 值列

      Pages.Index.fr.resx:将字符串 Greetings 添加到 Name 列,Bonjour! 到价值列

      Pages.Index.de.resx:将字符串 Greetings 添加到 Name 列和 Hallo 到价值列

    3. 将名为 CultureSelector.razor 的组件添加到共享文件夹:

    CultureSelector.razor

    @using  System.Globalization
    @inject NavigationManager NavigationManager
    
    @using System.Threading
    
    <div>@SelectedCulture</div>
    
    <select value="@SelectedCulture" @onchange="OnSelected">
        @foreach (var culture in Cultures)
        {
            <option value="@culture.Value">@culture.Caption</option>
        }
    </select>
    
    
    @code {
    
        private void OnSelected(ChangeEventArgs e)
        {
            var culture = (string)e.Value;
            var uri = new Uri(NavigationManager.Uri)
                .GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
            var query = $"?culture={Uri.EscapeDataString(culture)}&" +
                $"redirectUri={Uri.EscapeDataString(uri)}";
    
            NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
        }
    
        public string SelectedCulture { get; set; } = Thread.CurrentThread.CurrentUICulture.Name;
    
        public class CultureData
        {
            public string Caption { get; set; }
            public string Value { get; set; }
        }
    
        public List<CultureData> Cultures { get; set; } = new List<CultureData>()
        {
            new  CultureData() { Caption = "English", Value = "en-US" },
            new  CultureData() { Caption = "French", Value = "fr-FR" },
            new  CultureData() { Caption = "German", Value = "de-DE" },
        };
    }
    

    像这样在 MainLayout 中实例化 CultureSelector 组件:

    @inherits LayoutComponentBase
    @using System.Linq;
    @using System.Reflection
    @using Microsoft.AspNetCore.Components
    
    <div class="sidebar">
        <NavMenu />
    </div>
    
    <div class="main">
        <div class="top-row px-4">
            <CultureSelector></CultureSelector>
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @Body
        </div>
    </div>
    

    用法(索引.razor)

    @page "/"
    @using Microsoft.Extensions.Localization
    @inject Microsoft.Extensions.Localization.IStringLocalizer<Index> localizer
    
    <h1>@localizer["Greetings"].Value</h1>
    
    
    
    @code{ }
    

    Startrup.cs

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddLocalization(options => options.ResourcesPath = 
                                                          "Resources");
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddSingleton<WeatherForecastService>();
            services.AddControllers();
           
            services.Configure<RequestLocalizationOptions>(options =>
            {
                // define the list of cultures your app will support
                var supportedCultures = new List<CultureInfo>()
                                        {
                                             new CultureInfo("en-US"),
                                             new CultureInfo("fr-FR"),
                                             new CultureInfo("de-DE")
                                        };
    
                // set the default culture
                options.DefaultRequestCulture = new RequestCulture("en-US");
    
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });
    
        }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
    
          app.UseRequestLocalization(
         app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>> 
                                                                        ().Value);
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();
    
            app.UseEndpoints(endpoints =>
            {
                // enable controllers for the culture controller
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
        }
    

    添加一个控制器类到控制器文件夹(如果存在。如果不添加) 将其命名为 CultureController.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Localization;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace <Put here the namespace of your app>.Controllers
    {
        [Route("[controller]/[action]")]
        public class CultureController : Controller
        {
            public IActionResult SetCulture(string culture, string redirectUri)
            {
                if (culture != null)
                {
                    HttpContext.Response.Cookies.Append(
                        CookieRequestCultureProvider.DefaultCookieName,
                        CookieRequestCultureProvider.MakeCookieValue(
                            new RequestCulture(culture)));
                }
    
                return LocalRedirect(redirectUri);
            }
            public IActionResult ResetCulture(string redirectUri)
            {
                HttpContext.Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
    
                return LocalRedirect(redirectUri);
            }
        }
    }
    

    【讨论】:

    • 我实现了您的解决方案并且它有效,但是我有一个问题,如果您想创建一个资源文件,该文件具有您将在多个页面/组件中使用的公共资源,例如,保存,错误、删除、更新我想在资源中添加这些类型的文本并使用它而不是到处复制它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多