【问题标题】:Localization in .NET Core API.NET Core API 中的本地化
【发布时间】:2020-09-02 16:48:12
【问题描述】:

我正在尝试在 .NET Core API 2.2 中创建本地化中间件,我按照 Microsoft 的官方说明进行操作,但我不太明白,它是如何工作的?我没有视图,所以我必须用数据注释本地化模型吗?

我想通过 Accept-Language HTTP Header 获取语言值

这是我的中间件:

  public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.AddMvc()
            .AddDataAnnotationsLocalization();
     }

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var supportedCultures = new[] { "en-US", "ka-Ge" };
        var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
            .AddSupportedCultures(supportedCultures)
            .AddSupportedUICultures(supportedCultures);

        app.UseRequestLocalization(localizationOptions);
    }

型号:

 public class PersonsModel
{
    [Display(Name = "Name")]
    public string Name { get; set; }
}

我在 Resourses 文件夹中有 Resx 文件:PersonsController.en-Us

【问题讨论】:

    标签: api .net-core localization


    【解决方案1】:

    请编辑/改进/纠正/调整

    参考:

    https://damienbod.com/2015/10/21/asp-net-5-mvc-6-localization/

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1#implement-a-strategy-to-select-the-languageculture-for-each-request

    https://ml-software.ch/posts/writing-a-custom-request-culture-provider-in-asp-net-core-2-1

    ASP.NET Core Request Localization Options

    不,您需要在某个地方(在您的 LocalizationMiddleware 中)应用 IStringLocalizer,这样您就可以创建一个使用 LocalizedString 作为返回类型的 getFunction。 这样,您就可以在应用程序中的任何地方使用本地化。

    根据您当前线程的文化信息,以及您如何定义您的 SharedResource,您将获得相应的键值。

    您可以在下面找到解决方案:

    清单

    1. 在 DI 容器中配置服务

    一个。注册服务 启动方法(参见创建的单独类DIConfiguration)

    b.在 配置方法

    1. 定义本地化选项(CustomRequestCultureProvider 类)

    2. 在适当的项目(业务逻辑)中构建您的中间件

    3. 在同一个项目中定义 SharedResource.class 和 resx-files

    4. 在业务逻辑类(处理程序)中注入中间件

     

    1. 在 DI 容器中配置服务 一种。在启动方法中注册服务(参见创建的单独类DIConfiguration) 湾。在配置方法中配置和应用本地化选项

    使用……

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.SpaServices.AngularCli;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
    // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();services.AddCors(options =>
                {
                    options.AddPolicy(name: MyAllowSpecificOrigins,
                        builder =>
                        {
                            builder.WithOrigins("http://localhost:4200")
                                   .AllowAnyHeader()
                                   .AllowAnyMethod()
                                   .WithExposedHeaders("Content-Disposition");
                        });
                });
    
                // In production, the Angular files will be served from this directory
                services.AddSpaStaticFiles(configuration =>
                {
                    configuration.RootPath = "ClientApp/dist";
                });
                DiConfiguration.ConfigureServices(Configuration, services);
                AutoMapperConfiguration.ConfigureAutoMapper(services);
                services.AddMediatorAndBehaviour();
            }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                var supportedCultures = new[] { "nl", "en", "fr", "de" };
                var localizationOptions = new RequestLocalizationOptions()
                    .SetDefaultCulture(supportedCultures[0])
                    .AddSupportedCultures(supportedCultures)
                    .AddSupportedUICultures(supportedCultures);
    
                  localizationOptions.RequestCultureProviders.Clear();
    localizationOptions.RequestCultureProviders.Add(new  CustomRequestCultureProvider(localizationOptions));
    
    
                app.UseRequestLocalization(localizationOptions);
    
                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();
                if (!env.IsDevelopment())
                {
                    app.UseSpaStaticFiles();
                }
    
                app.UseAuthentication();
                app.UseRouting();
                app.UseAuthorization();
                app.UseCors(MyAllowSpecificOrigins);
    
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller}/{action=Index}/{id?}");
                });
    
                app.UseSpa(spa =>
                {
             // To learn more about options for serving an Angular SPA from ASP.NET Core,
             // see https://go.microsoft.com/fwlink/?linkid=864501
    
                    spa.Options.SourcePath = "ClientApp";
    
                    if (env.IsDevelopment())
                    {
                        spa.UseAngularCliServer(npmScript: "start");
                    }
                });
    
                app.UseHttpsRedirection();
            }
        }
     
    using System;
    using System.Text;
    …
    using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Http;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.IdentityModel.Tokens;
    
    public static class DiConfiguration
        {
            public static void ConfigureServices(IConfiguration configuration, IServiceCollection services)
            {
                // Configure Database services
                services.AddDbContextPool<IsisContext>(options => options.UseSqlServer(configuration.GetConnectionString("IsisDatabase")));
    
                services.AddScoped<IIsisUnitOfWork, IsisUnitOfWork>();
                …
                services.AddSingleton<ILocalizationMiddleware, LocalizationMiddleware>();
    
                services.AddControllers();
                services.AddMemoryCache();
                services.AddOptions();
    
                …
    
                services.AddLocalization(options => options.ResourcesPath = "Resources");
            }
    }
    
    1. 定义本地化选项(CustomRequestCultureProvider 类)

      使用……;

      使用 Microsoft.AspNetCore.Builder; 使用 Microsoft.AspNetCore.Http; 使用 Microsoft.AspNetCore.Localization; 使用系统; 使用 System.Linq; 使用 System.Threading.Tasks;

    公共类 CustomRequestCultureProvider : IRequestCultureProvider { 公共 CustomRequestCultureProvider(RequestLocalizationOptions 选项) {

            }
    
                public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
                {
                    try
                    {
                        var transmittedLanguageCode = httpContext.Request.GetTypedHeaders().AcceptLanguage;
                        string transmittedLanguageCodeString = transmittedLanguageCode.LastOrDefault().ToString();
                        return Task.FromResult(new ProviderCultureResult(transmittedLanguageCodeString));
                    }
                    catch (Exception)
                    {
                        return Task.FromResult(new ProviderCultureResult(LanguagesDefinition.NL)); // scenario NL is the default
                    }
                }
            }
    

    3. 在合适的项目中构建你的中间件(业务逻辑)

    using Microsoft.Extensions.Localization;
    
    namespace ….Business.LocalizationService
    {
        public interface ILocalizationMiddleware
        {
            public LocalizedString GetLocalizedString(string keyForResourceTable);
        }
    }
    
    using Microsoft.Extensions.Localization;
    using System.Reflection;
    
    namespace ….Business.LocalizationService
    {
        public class LocalizationMiddleware : ILocalizationMiddleware
        {
            private readonly IStringLocalizer localizer;
    
            public LocalizationMiddleware(IStringLocalizerFactory factory)
            {
                localizer = factory.Create("SharedResource", Assembly.GetExecutingAssembly().FullName);
            }
    
            public LocalizedString GetLocalizedString(string keyForResourceTable) { return localizer[keyForResourceTable]; }
        }
    }
    

    4;在同一个项目中定义(SharedResource.class 可选)Resources-folder 和 resx-files

    5.在业务逻辑类(handler)中注入中间件

    public class SomeClass
        {        
            public AdvancedSearchResultDtoToCsvMap(ILocalizationMiddleware localizationMiddleware)
            {
                Map(m => m.Id).Ignore();
                Map(m => m.ArticleCode).Index(0).Name(localizationMiddleware.GetLocalizedString("articlecode").Value);
                Map(m => m.Fullname).Index(1).Name(localizationMiddleware.GetLocalizedString("fullname").Value);
               …
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多