在单独的程序集中使用 View 组件进行 ASP NET 5 本地化

2024-02-06

我有一个“类库”项目,上面有一些“ViewComponents”,我已经让它们在我的“MVC 6 Web 应用程序”上工作(感谢这个问题 https://stackoverflow.com/questions/34236850/asp-net-mvc-6-view-components-in-a-separate-assembly)但现在我正在尝试将语言资源(本地化)添加到我的“ViewComponents”中。关于如何做到这一点有什么建议吗?

我已经将必要的行添加到“MVC 6 Web 应用程序”的启动文件中:

启动.cs

[...]
services.AddMvc()
        .AddViewLocalization(options => options.ResourcesPath = "Resources");
[...]
app.UseRequestLocalization(new RequestCulture(new CultureInfo("es-MX")));

我还添加了对“类库”视图的依赖项:

视图/共享/组件/标题/foo.cshtml

@using Microsoft.AspNet.Mvc.Localization
@inject IViewLocalizer LocString
<h1>@LocString["HelloWorld"]</h1>

并在我的“类库”项目中创建了资源文件夹和文件:

-Resources
   -Views.Shared.Components.Header.foo.cshtml.resx

但我得到的只是键的名称“HelloWorld”而不是本地化资源“Hola mundo”

简而言之,我错过了什么吗?有谁知道如何在“mvc 6 Web应用程序”上的“类库”中使用“视图组件”中的本地化资源

Notes:

  • 我正在使用 mvc 6 RC1

  • 来自非 ViewComponents 的其他视图的资源工作正常。

谢谢你!


问题是我不知道编译器在从视图组件访问时正在查找的资源文件的名称,因此以下这个线程 https://github.com/aspnet/Localization/issues/153我直接使用了 IStringLocalizerFactory:

public class HeaderViewComponent : ViewComponent
{
  private string viewName;
  private readonly IStringLocalizer _localizer;

  public HeaderViewComponent(IStringLocalizerFactory localizedFactory)
  {
     _localizer = localizedFactory.Create("name.of.your.resource.file", "Namespace");
  } 
  public IViewComponentResult Invoke()
  {
    [...]
    ViewBag.StringLocalizer = _localizer;
    return View("name", model);
  }
}

“Create”的第二个参数是你的“类库”的命名空间

然后在我的 Invoke 函数中,我将 _localizer 添加到 ViewBag 中以在视图上使用它(因为我还没有找到使用刚刚创建的 localizedFactory 注入 IViewLocalizer 的方法)。

我还将其添加到我的“类库”project.json 中:

"resource": [ "Views/**", "Resources/**" ]

希望它可以帮助其他人寻找使用类库资源的解决方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在单独的程序集中使用 View 组件进行 ASP NET 5 本地化 的相关文章

随机推荐