【问题标题】:Asp.Net Core Localized Resource in Separate Assembly单独程序集中的 Asp.Net Core 本地化资源
【发布时间】:2017-06-22 00:25:44
【问题描述】:

我正在尝试使用 .NET Core 的新本地化功能,但在 Microsoft 在此处提供的简单示例之外,https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization#resource-file-naming

我的控制器在一个单独的项目 ProjectA.Controllers 中,而我在一个公共项目 ProjectB.Localization 中有一个共享资源类。我已经按照文档中的规定配置了我的启动类。

我不清楚如何命名我的资源文件以及将它放在哪里。我已将选项配置为存储在“资源”目录中。是在 Web 项目中还是在我的 SharedResource 类所在的 ProjectB.Localization 中?文档说,如果它是一个单独的程序集,则应使用完整的命名空间。所以我将它命名为“WorldCart.Facilities.Localization.SharedResource.es.resx”,并将其放在网站的资源文件夹中。

当我运行网络应用程序并在家庭控制器中调试时,我没有得到翻译的字符串,我得到的是英文版本。

有什么想法吗?

【问题讨论】:

  • 我正在加载localhost/?culture=es。 Es 已添加到支持的文化中。
  • 你找到什么了吗?我想实现我自己的资源查找器,以便能够将资源放在控制器或视图文件夹中,然后如果没有找到字符串则故障回复到全局资源...stackoverflow.com/questions/44221309/…
  • 我没有找到任何东西,但我转向了其他挑战并且没有回头。 Microsoft 文档应该得到改进,可能会更好地解决这个问题。
  • 我所发现的只是使用资源路径来“”。所以资源在正确的目录中,不需要使用完整的命名空间。但我希望找到一种方法来实现resourceLocator 或resourceFinder。现在资源像这样工作......

标签: localization asp.net-core


【解决方案1】:

很晚的答案,但它可能会帮助某人...... 我遇到了类似的情况,我必须将资源文件放在单独的公共程序集中,而不是放在邮件 web/api 项目(Core 2.1)中。原因是,我可以使用来自其他程序集(如业务或 DAL 层)的本地化资源来引发警告/错误/信息消息。这就是我所做的:

假设我的 Web 项目命名空间是 MyApp.Web,并且我的资源位于单独的类库 MyApp.Resources 中。在资源库中,创建一个文件夹(可选),说“消息”,然后创建一个类Messages.cs。在遵守命名约定的同一文件夹内创建资源文件。例如,Messages.fr.resx

在主项目的ConfigureServices方法中,添加不带任何资源路径的本地化*:

services.AddLocalization();

services.Configure<RequestLocalizationOptions>(
    opts =>
    {
         /* your configurations*/
        var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en"),
            new CultureInfo("fr")
        };

        opts.DefaultRequestCulture = new RequestCulture("en", "en");
        // Formatting numbers, dates, etc.
        opts.SupportedCultures = supportedCultures;
        // UI strings that we have localized.
        opts.SupportedUICultures = supportedCultures;
    });

并在Configure方法中添加app.UseRequestLocalization();

在您的控制器中,注入IStringLocalizer&lt;Messages&gt; localizer,其中Messages 是您在资源库中创建的类。您所有的本地化资源都将在localizer 对象中可用,即localizer["your key or default text"]

  • 之所以没有在services.AddLocalization(); 选项中添加任何ResourcePath 是因为资源文件(Messages.fr.resx)和虚拟类(Messages.cs)在同一路径中。框架将检查与我们在IStringLocalizer&lt;&gt; 中指定的类相关的资源文件。如果Messages.csMyApp.Resources lib 的根文件夹中并且资源文件在文件夹“xyz”中,那么配置应该是services.AddLocalization(ops =&gt; ops.ResourcesPath = "xyz");

UPDATE - 响应 cmets 中的查询:

MVC 视图 在 MVC 视图中,记录的方法使用 IViewLocalizer,但不支持资源共享。因此,您可以在视图中注入IStringLocalizer&lt;&gt; 以使用共享资源。例如:

@inject IStringLocalizer<Messages> localizer
<h2>Information - @localizer["Shared resource access in MVC Views"]</h2>

数据注释 为了在数据注解中使用共享资源,可以在服务中使用工厂方法:

services.AddMvc()
      .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
      .AddDataAnnotationsLocalization(options => {
          options.DataAnnotationLocalizerProvider = (type, factory) =>
              factory.Create(typeof(Messages));
      }); 

typeof(Messages) 中的Messages 是您的共享资源虚拟类。

【讨论】:

  • 你有这种方法的任何资源(官方或非官方)吗?我希望你能用更好的文档记录它。
  • @ibubi - 我找不到任何相同的资源或文档。结束了类似的要求并自己弄清楚了。还有一个博客采用不同的方法 (blog.mohnady.com/2017/05/…),我有点不喜欢。
  • 我看到您正在一个 api 项目中实现它,因此视图模型上的数据注释可能不在您的范围内,但是您知道这种方法涵盖了通过数据注释进行模型本地化吗?
  • 对于 mvc 视图,如果打算继续使用常规方法而不是共享资源,则可以实现 IViewLocalizer,如果需要示例,请联系我,我可以为此更新答案。
  • 非常感谢@Developer!我觉得 .net 核心的文档很糟糕,它只是触及了任何现实世界场景的表面。感谢像你这样的人为重要的场景制作“文档”!
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2016-10-10
  • 2021-10-19
相关资源
最近更新 更多