单独组装中的Asp.Net核心本地化资源

时间:2017-02-04 19:10:27

标签: localization asp.net-core

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

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

我不清楚如何命名我的资源文件以及准确放置它的位置。我已将选项存储在目录" Resources"中。是在我的SharedResource类的Web项目或ProjectB.Localization中吗?文档说如果它是一个单独的程序集,则应使用完整的命名空间。所以我给它起了名字," WorldCart.Facilities.Localization.SharedResource.es.resx"并将其放在网站的资源文件夹中。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

假设我的Web项目名称空间为MyApp.Web,而我的资源位于单独的类lib MyApp.Resources中。在资源库中,创建一个文件夹(可选),说“ Messages”并创建一个类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<Messages> localizer,其中Messages是您在资源库中创建的类。您所有的本地化资源将在localizer对象(即localizer["your key or default text"])中可用。

  • ResourcePath选项中不添加任何services.AddLocalization();的原因是由于资源文件(Messages.fr.resx)和哑类(Messages.cs)在同一条道路上。框架将检查相对于我们在IStringLocalizer<>中指定的类的资源文件。如果Messages.cs位于MyApp.Resources lib的根文件夹中,而资源文件位于文件夹“ xyz”内,则配置应为services.AddLocalization(ops => ops.ResourcesPath = "xyz");

enter image description here

更新-响应评论中的查询:

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

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

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

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

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