如何从ASP.NET Core Controller使用IStringLocalizer获取本地化的字符串?

有点困惑,在ASP.Net Core 2.0中本地化超级简单的hello-world示例。 我的关于页面设置为呈现两个本地化的字符串:

  • 从视图(使用IViewLocalizer
  • 从代码中(通过控制器使用IStringLocalizer<HomeController>
  • 控制器中的代码拒绝适当地获取loc字符串。 这并不复杂,我错过了什么明显的东西?

    About.cshtml

    @using Microsoft.AspNetCore.Mvc.Localization
    
    @inject IViewLocalizer Localizer
    @{
        ViewData["Title"] = "About";
    }
    <h2>@ViewData["Title"]</h2>
    <h3>@ViewData["Message"]</h3>
    
    <p>@Localizer["Use this area to provide additional information."]</p>
    

    ^请注意两个字符串:“消息”将使用IStringLocalizer (请参见下面的HomeController)从代码本地化,并且@Localizer将使用IViewLocalizer类。

    HomeController.cs

    public class HomeController : Controller
    {
        private readonly IStringLocalizer _localizer;
    
        public HomeController(IStringLocalizer<HomeController> localizer)
        {
           _localizer = localizer;
        }
    
        public IActionResult Index()
        {
            return View();
        }
    
        public IActionResult About()
        {
            ViewData["Message"] = _localizer["Your application description page."];
    
            return View();
        }
    }
    

    Startup.cs (相关部分)

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddLocalization(options => options.ResourcesPath = "Resources");
    
            services.AddMvc()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization();
    
            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                {
                    new CultureInfo("en-US"),
                    new CultureInfo("fr-CH"),
                };
    
                options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(locOptions.Value);
    
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
    
            app.UseStaticFiles();
    
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    

    资源:

    Views.Home.About.fr-CH.resx

    ^其中有两个值:

  • “使用此区域提供更多信息。” =“使用这个区域... fr-CH成功!”
  • “你的应用程序描述页面。” =“您的应用程序描述... fr-CH成功!”
  • 我的结果:

    本地主机:56073 /首页/

    ^这在en-US中按预期呈现字符串(默认情况下不会发现任何内容,使用实际上硬编码的字符串)

    本地主机:56073 /首页/关于文化= FR-CH

    ^这只会渲染第二个字符串:“使用此区域... fr-CH成功!”,这明显意味着所有连接的代码正在工作并按预期找到fr-CH.resx。

    但是,第一个字符串(在代码中设置为ViewData["Message"] )没有得到fr-CH版本! 这就像IStringLocalizer<HomeController> 没有意识到有指定的lang,或未能找到清晰可用的fr-CH.resx。

    为什么???

    此外,顺便说一句,我也试过使用ShareResource的例子(见下面的链接),并在工厂传递给HomeController作为IStringLocalizerFactory factory ,也没有爱,仍然没有得到fr-CH资源。 叹。

    其他说明:

    使用这个作为我的主要参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization

    使用VS 2017,最新的更新,与ASP.Net核心2.0


    您在控制器中使用IStringLocalizer<HomeController>作为本地化器来查找本地化字符串。 本地化程序将在Resources文件夹中查找以查找YouControllerNameSpace.HomeController资源文件,并且由于它未找到它,它将返回传递给本地化程序的原始密钥。

    要解决该问题,可以使用以下任一选项:

  • 注入IStringLocalizer<T>
  • 注入IStringLocalizerFactory
  • 有关资源文件名的更多信息,请查看文档中的资源文件命名部分。

    注入IStringLocalizer <T>

    使用这个选项,你应该有一个与全名T相同的资源文件,在你的情况下,控制器代码应该和它一样:

    IStringLocalizer _localizer;
    public HomeController(IStringLocalizer<HomeController> localizer)
    {
       _localizer = localizer;
    }
    

    对于资源文件:

  • 确保你有YouControllerNameSpace.HomeController资源文件。 ( YouControllerNameSpace只是一个占位符,使用你的控制器命名空间。)
  • 确保你在资源文件中有指定的字符串。
  • 确保你有不同文化的资源文件。
  • 注入IStringLocalizerFactory

    使用这个选项你可以使用任何文件作为资源文件。 例如,如果您想从Views.Home.About资源文件读取资源,则应该将控制器代码更改为:

    IStringLocalizer _localizer;
    public HomeController(IStringLocalizerFactory factory)
    {
        _localizer = factory.Create("Views.Home.About", 
            System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }
    

    对于资源文件:

  • 确保你有Views.Home.About资源文件。
  • 确保你在资源文件中有指定的字符串。
  • 确保你有不同文化的资源文件。

  • 尝试在这个答案中由tmg描述的技术。

    具体而言,请尝试添加行

    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    };
    

    到您的ConfigureServices()函数

    链接地址: http://www.djcxy.com/p/52539.html

    上一篇: How to get localized string from ASP.NET Core Controller using IStringLocalizer?

    下一篇: ASP.NET Core CORS WebAPI: no Access