【问题标题】:Localization in ASP.NET Core 3.1 MVCASP.NET Core 3.1 MVC 中的本地化
【发布时间】:2020-07-10 11:24:16
【问题描述】:

我正在尝试将本地化添加到我的 ASP.NET Core 3.1 MVC 项目中,遗憾的是我找不到任何文章或教程来说明如何以简单的方式进行。

每个人都有一些我无法理解的问题。

谁能告诉我一个简单的方法来做到这一点? 好的,我尝试做 syncfusion.com/blogs/post/... 但我遇到了一个问题 (options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { IndexOfCulture = 1, IndexofUICulture = 1 } };) 它说 RequestCultureProviders 没有'没有 UICulture 索引......

我已经达到了这个水平:

    @using Microsoft.AspNetCore.Localization
@using Microsoft.Extensions.Localization 
@using System.Resources 
@model Index
@inject IStringLocalizer<Index> localizer 
@inject IHtmlLocalizer<Index> htmlLocalizer
@{
    ViewData["Title"] = "M-POS";
    //Microsoft.AspNetCore.Localization.IRequestCultureFeature requestCultureFeature;
    var requestCulture = CultureInfo.CurrentCulture;
    

}
    <div class="text-center">
        <h1 class="display-4">@localizer["Welcome"]</h1>
        <p>@localizer["Learn"]</p>


        <table class="table culture-table">
            <tr>
                <td style="width:50%;">Culture</td>
                <td>@requestCulture.DisplayName {@requestCulture.Name}</td>
            </tr>
            <tr>
                <td>UI Culture</td>
                <td>@requestCulture.Name</td>
            </tr>
            <tr>
                <td>UICulture Parent</td>
                <td>@requestCulture.Parent</td>
            </tr>
            <tr>
                <td>Date</td>
                <td>@DateTime.Now.ToLongDateString()</td>
            </tr>
            <tr>
                <td>Currency</td>
                <td>
                    @(12345.00.ToString("c"))
                </td>
            </tr>
            <tr>
                <td>Currency</td>
                <td>
                    @(12345.00.ToString("c"))
                </td>
            </tr>
            <tr>
                <td>Number</td>
                <td>
                    @(123.45m.ToString("F2"))
                </td>
            </tr>
        </table>
    </div>

然后我在该文件夹中有一个名为 Resources 的文件夹 我有一个名为 Resource.resx 和 Resource.en-US.resx 的文件 StartUp.cs 文件是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.EntityFrameworkCore;
using POS3.Data;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Models;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Razor;
using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Localization.Routing;
using Microsoft.AspNetCore.Routing;
using Microsoft.CodeAnalysis.Options;

using Microsoft.AspNetCore.Http;
using System.Xml.Linq;

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

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
              options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddDefaultIdentity<UserAccount>()
                .AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddRazorPages();
            //localization startup

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddLocalization(options => options.ResourcesPath = "Resources");
            services.AddMvc().AddViewLocalization();
            services.AddMvc()
            .AddViewLocalization(options => options.ResourcesPath = "Resources")
            .AddDataAnnotationsLocalization();

            

            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                 {
                    
                    new CultureInfo("ar-SA"),
                    new CultureInfo("en-US")
                };
                options.DefaultRequestCulture = new RequestCulture("en-US");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });

            //services.Configure<RequestLocalizationOptions>(options =>
            //{
            //    var supportedCultures = new[]
            //    {
            //    new CultureInfo("en-US"),
            //    new CultureInfo("ar-SA"),
            //    new CultureInfo("es"),
            //};

            //    options.DefaultRequestCulture = new RequestCulture("en-US");
            //    options.SupportedCultures = supportedCultures;
            //    options.SupportedCultures = supportedCultures;
            //    //options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { IndexOfCulture = 1, IndexOfCulture = 1 } };
            //});




            services.AddMvcCore();
            services.AddAuthorization(options => {
                options.AddPolicy("readonlypolicy",
                    builder => builder.RequireRole("Admin", "Manager", "Cashier", "User", "Super User"));
                options.AddPolicy("writepolicy",
                    builder => builder.RequireRole("Admin", "Manager", "Super User"));
            });

            

              


            services.Configure<IdentityOptions>(options =>
            {
                // Default Password settings.
                options.Password.RequireDigit = false;
                options.Password.RequiredLength = 6;
                options.Password.RequiredUniqueChars = 1;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = false;
                options.Password.RequireLowercase = false;
            });

            services.AddControllersWithViews();
            services.AddRazorPages();
            services.AddControllers(config =>
            {
                
                var policy = new AuthorizationPolicyBuilder()
                                 .RequireAuthenticatedUser()
                                 .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            });

            services.Configure<PasswordHasherOptions>(options =>
            options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
            );
            


            //services.AddSingleton<IEmailSender, EmailSender>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
           
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/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.UseRouting();

            //configer localization
            


            var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
            app.UseRequestLocalization(localizationOptions);

            app.UseAuthentication();
            app.UseAuthorization();           
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                
                endpoints.MapRazorPages();
            });

           
        }
    }
}

现在我看不到 resource.en-US.resx 文件值,我想我遗漏了一些东西。

【问题讨论】:

  • 嗨,@MansourHamoud,我已经发布了解决您问题的代码。它对我有用。如果答案解决了您的问题,请标记它以帮助更多人。如果没有,我们或许可以继续探索解决方案。感谢您的时间和努力。

标签: localization asp.net-core-mvc


【解决方案1】:

Q1:这个问题(options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { IndexOfCulture = 1, IndexofUICulture = 1 } };)它说 RequestCultureProviders 没有 IndexofUICulture......

下载the samples你会发现RouteDataRequestCultureProvider

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;

namespace LocalizationSampleSingleResxFile
{
    public class RouteDataRequestCultureProvider : RequestCultureProvider
    {
        public int IndexOfCulture;
        public int IndexofUICulture;

        public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException(nameof(httpContext));

            string culture = null;
            string uiCulture = null;

            culture = uiCulture = httpContext.Request.Path.Value.Split('/')[IndexOfCulture]?.ToString();

            var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

            return Task.FromResult(providerResultCulture);
        }
    }
}

Q2:更改资源名称

您已经命名为en-US,因此您的资源文件名必须格式为en-US

index.cshtml:

测试截图:


Globalization and localization in ASP.NET Core
Adding Localisation to an ASP.NET Core application
How to Use Localization in an ASP.NET Core Web API

【讨论】:

  • 我以前看过这些网站,但它们没有帮助:(
  • 也许您可以详细说明您遇到的问题,以便我们提供帮助。
  • 好的,我试着做syncfusion.com/blogs/post/… 但我遇到了这个问题(options.RequestCultureProviders = new[] { new RouteDataRequestCultureProvider { IndexOfCulture = 1, IndexofUICulture = 1 } };)它说RequestCultureProviders 没有 IndexofUICulture ......然后我尝试了 mikesdotnetting.com/article/346/… 但另一个问题是我无法看到另一种文化 exept en
  • 嗨,@MansourHamoud,对不起,我现在没时间实现这些代码了。明天试试。此外,您可以将您的评论粘贴到您的问题中,以便更多人可以提供帮助。
  • 嗨,@Michelle 我已经编辑了问题并添加了示例代码,请查看
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多