ASP.NET Core中外部类库的本地化

Yur*_* N. 15 c# dll .net-core asp.net-core asp.net-core-webapi

我有两个项目:

  • MyWebApp - ASP.NET核心Web API
  • MyServices - .NET Core类库,包含上述项目的有用服务

如何IStringLocalizerMyServices中添加本地化?.resx文件必须在哪里?

Shi*_*ror 14

这就是我解决它的方式.感谢Popa Andrei的回答,指引我到正确的地方.

班级图书馆

解决方案 - >右键单击 - >添加 - >新建项目... - > .Net标准 - >类库 - >我使用的名称是ResourceLibrary

ResourceLibrary
|- Resources
|----- SharedResource.resx
|----- SharedResource.he.resx
|- SharedResource.cs
Run Code Online (Sandbox Code Playgroud)

SharedResource.cs代码:

using Microsoft.Extensions.Localization;

namespace ResourceLibrary
{
    public interface ISharedResource
    {
    }
    public class SharedResource : ISharedResource
    {
        private readonly IStringLocalizer _localizer;

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

        public string this[string index]
        {
            get
            {
                return _localizer[index];
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Web应用程序

右键单击webapp项目 - >添加 - >参考... - >检查资源库

在你的webapp startup.cs中:

using ResourceLibrary;
...

public void ConfigureServices(IServiceCollection services) {
    ...
    services.AddLocalization(o => { o.ResourcesPath = "Resources"; });

    services.Configure<RequestLocalizationOptions>(options =>
            {
                CultureInfo[] supportedCultures = new[]
                {
                    new CultureInfo("en"),
                    new CultureInfo("he")
                };

                options.DefaultRequestCulture = new RequestCulture("en");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
             });
     ...
     }

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
        ...
        app.UseRequestLocalization(); //before app.UseMvc()
        ...
        }
Run Code Online (Sandbox Code Playgroud)

在控制器中使用示例:

 using ResourceLibrary;
 ...

 public class ExampleController : Controller
    {
    private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
    public EmailsController(IStringLocalizer<SharedResource> sharedLocalizer)
    {
        _sharedLocalizer = sharedLocalizer;
    }

    [HttpGet]
    public string Get()
    {
        return _sharedLocalizer["StringToTranslate"];
    }
Run Code Online (Sandbox Code Playgroud)

查看示例:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<ResourceLibrary.SharedResource> SharedLocalizer

<p>@SharedLocalizer["StringToTranslate"]</p>
Run Code Online (Sandbox Code Playgroud)

  • 你为什么使用 ISharedResource? (2认同)

Pop*_*rei 5

您可以将 .resx 文件存储在MyServices项目上,并创建一种基于密钥检索资源的方法。为了从MyServices访问 IStringLocalizer,您必须安装Microsoft.Extensions.Localization.Abstractionsnuget。

基本上本地化配置必须保留在MyWebApp(启动类)上,但在MyServices 上,您必须添加该 nuget 以使用 IStringLocalizer 并创建一个类似 GetResourceValueByKey(key) 的方法。可以从将引用MyServices项目的任何位置调用此方法。

使用 Microsoft.Extensions.Localization;

命名空间全球化图书馆 { 公共类 SharedResource:ISharedResource { 私有只读 IStringLocalizer _localizer;

public SharedResource(IStringLocalizer<SharedResources> localizer) { _localizer = localizer; } public string GetResourceValueByKey(string resourceKey) { return _localizer[resourceKey]; } }}
Run Code Online (Sandbox Code Playgroud)


小智 3

一种典型的解决方案是让 MyServices 程序集返回资源键(而不是返回要在屏幕上显示的实际资源)。您可以将 .resx 文件作为 MyWebApp 的一部分,并为每个资源键提供资源值。这样,您的 MyService 就可以被各种 UI 应用程序使用,每个应用程序都有自己的资源表示形式。

另一种方法是将 .resx 文件保留为 MyService 本身的一部分。MyWebApp 可以加载其他程序集并从中读取资源文件。

另一种选择是将资源保留为新程序集,然后再次从 MyWebApp 加载它。

检查以下 SO 答案以获取有关如何从另一个程序集访问 .resx 文件的更多详细信息 -

如何读取不同程序集中嵌入的 .resx

从 dll 中嵌入的 .resx 访问字符串资源?

如何访问另一个程序集的.resx?