簡體   English   中英

如何使用IStringLocalizer從ASP.NET Core Controller獲取本地化字符串?

[英]How to get localized string from ASP.NET Core Controller using IStringLocalizer?

有點困惑在這里,ASP.Net Core 2.0中的本地化超級簡單的hello-world示例。 我的“ 關於”頁面設置為呈現兩個本地化字符串:

  1. 從視圖(使用IViewLocalizer
  2. 從代碼(使用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>

^注意兩個字符串:“Message”將使用IStringLocalizer從代碼本地化(請參閱下面的HomeController),@ Local將使用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示例(參見下面的鏈接),並將工廠作為IStringLocalizerFactory factory傳遞給HomeController ctor,也沒有愛,仍然沒有獲得fr-CH資源。 嘆。

其他說明:

使用它作為我的主要參考: https//docs.microsoft.com/en-us/aspnet/core/fundamentals/localization

使用VS 2017,最新更新,使用ASP.Net Core 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()函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM